我有一個腳本,它運行我的PHP腳本,每個X次:運行bash腳本作爲守護
#!/bin/bash
while true; do
/usr/bin/php -f ./my-script.php
echo "Waiting..."
sleep 3
done
我怎樣才能啓動它作爲守護進程?
我有一個腳本,它運行我的PHP腳本,每個X次:運行bash腳本作爲守護
#!/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(標準輸入,輸出和錯誤)分離的過程。如果要將輸出保留在日誌文件中,請將第一個/dev/null
替換爲/ path/to/logfile。
你必須重定向輸出,否則它不會作爲一個真正的守護進程運行(它將取決於你的shell讀寫輸出)。
你可以去/etc/init.d/ - 你會看到一個名爲skeleton的守護進程模板。
您可以複製它,然後在啓動函數下輸入您的腳本。
您也可以考慮在黑色中運行腳本在最後加上'&'或者用nohup運行它。 –
@LuisMuñoz如何讓它在後臺自動運行。例如,當您發出/etc/init.d/mysql start時,守護進程默認啓動並在後臺運行。 –
@DavidOkwii將你的代碼放在一個函數中並在後臺運行。檢查我的答案添加到這個問題。 –
守護進程是運行作爲後臺進程,而不是交互式用戶的直接控制下的只是節目...
[下面的bash代碼是Debian系統 - Ubuntu的,Linux Mint的發行版和等等]
最簡單的方法:
最簡單的方法是編輯您的/etc/rc.local文件中,然後就從那裏運行腳本(即每次你啓動系統) :
sudo nano /etc/rc.local
添加以下內容並保存:
#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &
更好的方式來做到這一點是通過新貴營造一個守護進程:
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
另一個很酷的技巧的狀態是在後臺運行功能或子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") &
那我怎麼殺呢? –
你必須找到它的pid併發送一個信號。下面是linux系統的一個不安全的例子:'kill $(ps -fade | grep myscript.sh | grep -v grep | awk'{print $ 2}')'。這將殺死其名稱或參數中包含「myscript.sh」的所有進程,因此使用起來不是很安全,但可以調整它以滿足您的需求。 – micromoses
謝謝,這很有幫助!你能解釋一下'2&1 dev/null'在做什麼嗎? –