Shell-Script

如何為 shell 腳本創建服務,以便可以像守護程序一樣啟動和停止它?

  • November 29, 2021

我正在使用 CentOS 7,我的目標是每五秒鐘創建一個 cron,但據我研究,我們只能使用 cron 一分鐘,所以我現在正在做的是創建一個 shell 文件。

命中.sh

while sleep 5; do curl http://localhost/test.php; done

但我通過右鍵點擊它手動點擊它。

我想要的是為該文件創建一個服務,以便我可以自動啟動和停止它。

我找到了創建服務的腳本

#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
   # code to start app comes here 
   # example: daemon program_name &
}

stop() {
   # code to stop app comes here 
   # example: killproc program_name
}

case "$1" in 
   start)
      start
      ;;
   stop)
      stop
      ;;
   restart)
      stop
      start
      ;;
   status)
      # code to check status of app comes here 
      # example: status program_name
      ;;
   *)
      echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

但是我不知道在 start 或 stop 方法中寫什麼我嘗試將相同的 hit.sh 內容放入其中,start(){}但它}在 stop 方法中給出了錯誤。

嘗試在現代系統上將腳本作為守護程序執行的使用者應該使用systemd

[Unit]
Description=hit service
After=network-online.target

[Service]
ExecStart=/path/to/hit.sh

[Install]
WantedBy=multi-user.target

將此另存為/etc/systemd/system/hit.service,然後您將能夠使用systemctl start hit等啟動/停止/啟用/禁用它。

2015年的舊答案:

如果您想重用您的程式碼範例,它可能類似於:

#!/bin/bash

case "$1" in 
start)
  /path/to/hit.sh &
  echo $!>/var/run/hit.pid
  ;;
stop)
  kill `cat /var/run/hit.pid`
  rm /var/run/hit.pid
  ;;
restart)
  $0 stop
  $0 start
  ;;
status)
  if [ -e /var/run/hit.pid ]; then
     echo hit.sh is running, pid=`cat /var/run/hit.pid`
  else
     echo hit.sh is NOT running
     exit 1
  fi
  ;;
*)
  echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

當然,你想作為服務執行的腳本應該去 eg /usr/local/bin/hit.sh,上面的程式碼應該去/etc/init.d/hitservice

對於需要執行此服務的每個執行級別,您將需要創建相應的符號連結。例如,一個名為的符號連結/etc/init.d/rc5.d/S99hitservice將為執行級別 5 啟動服務。當然,您仍然可以通過service hitservice start/手動啟動和停止它service hitservice stop

引用自:https://unix.stackexchange.com/questions/236084