[英]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,而僅在標簽中,因此,我想在這里發布一個主題,您必須理解這些主題,以便控制他/她的程序,而與分發無關:
對於您的問題,可以通過在/ 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.