簡體   English   中英

將bash腳本作為守護程序運行

[英]Run bash script as daemon

我有一個腳本,該腳本每隔X次運行一次我的PHP腳本:

#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done

如何將其作為守護程序啟動?

要將其作為完整的守護程序從shell運行,您需要使用setsid並重定向其輸出。 您可以將輸出重定向到日志文件,或重定向到/dev/null以將其丟棄。 假設您的腳本名為myscript.sh,請使用以下命令:

setsid myscript.sh >/dev/null 2>&1 < /dev/null &

這會將進程與當前的shell(stdin,stdout和stderr)完全分開。 如果要將輸出保留在日志文件中,請用/ path / to / logfile替換第一個/dev/null

您必須重定向輸出,否則它將不能作為真正的守護程序運行(它將取決於您的shell來讀寫輸出)。

守護程序只是作為后台進程運行的程序,而不是受交互式用戶直接控制的程序。

[下面的bash代碼適用於Debian系統-Ubuntu,Linux Mint發行版等]

簡單的方法:

簡單的方法是編輯/etc/rc.local文件,然后從那里運行腳本(即,每次啟動系統時):

sudo nano /etc/rc.local

添加以下內容並保存:

#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &

更好的方法是通過Upstart創建一個守護進程:

sudo nano /etc/init/TheNameOfYourDaemon.conf

添加以下內容:

description "My Daemon Job"
author "Your Name"
start on runlevel [2345]    

pre-start script
  echo "[`date`] My Daemon Starting" >> /var/log/TheNameOfYourDaemonJobLog.log
end script

exec /bin/sh TheNameOfYourScript.sh > /dev/null &

保存這個。

確認一切正常:

init-checkconf /etc/init/TheNameOfYourDaemon.conf

現在重啟機器:

sudo reboot

現在,當您啟動系統時,您可以看到日志文件說明您的守護程序正在運行:

cat  /var/log/TheNameOfYourDaemonJobLog.log

•現在,您可以通過以下方式啟動/停止/重新啟動/獲取守護程序的狀態:

重新啟動:這將停止,然后啟動服務

sudo service TheNameOfYourDaemonrestart restart

啟動:如果服務未運行,它將啟動服務

sudo service TheNameOfYourDaemonstart start

停止:如果服務正在運行,它將停止服務

sudo service TheNameOfYourDaemonstop stop

狀態:這將顯示服務的狀態

sudo service TheNameOfYourDaemonstatus status

您可以轉到/etc/init.d/-您將看到一個名為skeleton的守護程序模板。

您可以復制它,然后在啟動功能下輸入腳本。

另一個很酷的技巧是在后台運行函數或子shell,盡管並不總是可行的

name(){
  echo "Do something"
  sleep 1
}

# put a function in the background
name &
#Example taken from here
#https://bash.cyberciti.biz/guide/Putting_functions_in_background

在后台運行子shell

(echo "started"; sleep 15; echo "stopped") &

一些評論者已經指出,您的問題的答案並不適用於所有發行版。 由於您沒有在問題中包括CentOS,而僅在標簽中,因此,我想在這里發布一個主題,您必須理解這些主題,以便控制他/她的程序,而與分發無關:

  1. 什么是init守護進程(可選)
  2. 什么是inittab文件(/ etc / inittab)
  3. inittab文件在您的發行版中有什么作用(例如,它實際上運行/etc/init.d中的所有腳本嗎?)

對於您的問題,可以通過在/ etc / inittab中添加以下行來在sysinit上啟動腳本,並在終止時重新生成該腳本:

# start and respawn after termination
ttyS0::respawn:/bin/sh /path/to/my_script.sh

當然,必須事先使腳本可執行:

chmod +x /path/to/my_script.sh

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM