關於 web service, unity, blogger 等軟體工程筆記

Create Linux service wrapper script

Edit icon 沒有留言
Coding with style

遠端登入 Linux 操作,每次啟動不因遠端登出而關閉的程式 (program),或是關閉上一次運行的程序 (process),都需要輸入許多指令,對於不熟 Linux 新手的我來說,這有點麻煩啊。因此有這懶人包 bash script,一個包裝將程式包裝成 service 的腳本,協助 start/stop/restart process。

使用 nohup 啟用程式,並使用暫存檔記錄該次執行的 pid。當要停止該程序時,讀取該暫存檔 pid,然後關閉該程序 (kill process)。

#!/bin/bash
SERVICE_NAME=My-Service-Name
PATH_BIN=Binary-Path
PID_PATH_NAME=/tmp/AppName-pid
case $1 in
   start)
      echo "$SERVICE_NAME starting ..."
      if [ ! -f $PID_PATH_NAME ]; then
         nohup $PATH_BIN &
                  echo $! > $PID_PATH_NAME
         echo "$SERVICE_NAME started ..."
      else
         echo "$SERVICE_NAME is already running ..."
      fi
   ;;
   stop)
      if [ -f $PID_PATH_NAME ]; then
         PID=$(cat $PID_PATH_NAME);
         echo "$SERVICE_NAME stoping ..."
         kill $PID;
         echo "$SERVICE_NAME stopped ..."
         rm $PID_PATH_NAME
      else
         echo "$SERVICE_NAME is not running ..."
      fi
   ;;
   restart)
      if [ -f $PID_PATH_NAME ]; then
         PID=$(cat $PID_PATH_NAME);
         echo "$SERVICE_NAME stopping ...";
         kill $PID;
         echo "$SERVICE_NAME stopped ...";
         rm $PID_PATH_NAME
         echo "$SERVICE_NAME starting ..."
         nohup $PATH_BIN &
                  echo $! > $PID_PATH_NAME
         echo "$SERVICE_NAME started ..."
      else
         echo "$SERVICE_NAME is not running ..."
      fi
   ;;
   *)
      echo $"Usage: $0 {start|stop|restart}"
      exit 1
esac 
exit 0
  • Line2:服務名稱
  • Line3:應用程式位置
  • Line4:暫存檔案位置,也是此 bash 判斷服務有沒有運行的依據。假設應用程式是 siyuan,建議是填 /tmp/siyuan-pid
  • Line6-15:start,採用 nohup 執行應用程式,避免登出自動關閉應用程式
  • Line16-26:stop,從 PID_PATH_NAME 讀取 pid,殺掉應用程式後,刪除該暫存檔
  • Line27-41:restart,先 stop 在 start
  • Line42-44:當命令無法接受時,輸出提示訊息:僅接受 [start|stop|restart]

之後若將這 script 註冊,讓 linux 開機後執行,就真的是名副其實的服務程式了。

參考來源:serverfault.com

沒有留言: