2013-10-07 119 views
41

我有一個腳本,它運行我的PHP腳本,每個X次:運行bash腳本作爲守護

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

我怎樣才能啓動它作爲守護進程?

回答

91

要將其作爲shell的完整後臺進程運行,您需要使用setsid並重定向其輸出。您可以將輸出重定向至日誌文件,或者將其丟棄至/dev/null。假設你的腳本被稱爲myscript.sh,請使用以下命令:

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

這將徹底從當前的shell(標準輸入,輸出和錯誤)分離的過程。如果要將輸出保留在日誌文件中,請將第一個/dev/null替換爲/ path/to/logfile。

你必須重定向輸出,否則它不會作爲一個真正的守護進程運行(它將取決於你的shell讀寫輸出)。

+5

那我怎麼殺呢? –

+7

你必須找到它的pid併發送一個信號。下面是linux系統的一個不安全的例子:'kill $(ps -fade | grep myscript.sh | grep -v grep | awk'{print $ 2}')'。這將殺死其名稱或參數中包含「myscript.sh」的所有進程,因此使用起來不是很安全,但可以調整它以滿足您的需求。 – micromoses

+3

謝謝,這很有幫助!你能解釋一下'2&1

15

你可以去/etc/init.d/ - 你會看到一個名爲skeleton的守護進程模板。

您可以複製它,然後在啓動函數下輸入您的腳本。

+2

您也可以考慮在黑色中運行腳本在最後加上'&'或者用nohup運行它。 –

+0

@LuisMuñoz如何讓它在後臺自動運行。例如,當您發出/etc/init.d/mysql start時,守護進程默認啓動並在後臺運行。 –

+0

@DavidOkwii將你的代碼放在一個函數中並在後臺運行。檢查我的答案添加到這個問題。 –

23

守護進程是運行作爲後臺進程,而不是交互式用戶的直接控制下的只是節目...

[下面的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 
+4

找到它你應該真的指出這是用於發行版的,因爲這些命令和路徑不是糾正所有發行版。 – SgtPooki

+1

好點sgtPooki。我添加了一個警告,說明我的示例引用了Ubuntu/Mint發行版等。感謝您的評論。 – CMP

+0

有人可以對此答案執行systemd加載項嗎? :) – Mitja

1

另一個很酷的技巧的狀態是在後臺運行功能或子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") &