正確的 Bash 守護程序腳本創建
在 Ubuntu 上,我將骨架複製
/etc/init.d/
為一個新文件,並使其“全部”可執行(就像該目錄中的其他文件一樣)。在其中,我創建了一個“foo”,它只是另一個 Bash 腳本/usr/sbin
,但它的特殊之處在於它位於一個循環中,等待來自 PHP 網頁的命名管道連接。(更多細節在這裡,雖然這是一個副話題。)因為它必須在命名管道連接上循環等待,這顯然會在命令行中掛起命令。沒什麼大不了的,因為我實際上希望它掛起並等待新的連接。但我不希望它發生在前台。所以,我讓 start-stop-daemon 使用 –background 選項。
好的,它適用於啟動和狀態,但停止不起作用——它將命令以及
cat /tmp/pipe
我在/usr/sbin/foo
Bash 腳本中的命令留在記憶體中。他們警告說,在 start-stop-daemon 命令上使用 –background 選項時可能會發生這種情況。問題
那麼,當 /usr/sbin/foo 執行時正確停止 /usr/sbin/foo
start-stop-daemon --background
以及停止 /usr/sbin/foo 可能呼叫的任何子程序(例如 cat /tmp/pipe 命令)的正確方法是什麼?我的意思是,我想我可以使用 killall,但這有點致命。也許您知道更有效的方法?
我認為在這種情況下,shell 將成為包含腳本執行的各種命令的程序組的領導者。您可以通過向程序組的 PID 對面發送信號來終止程序組:
kill -TERM -$(cat /var/run/my_shell_daemon.pid)
我建議諮詢 LSB:
http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/tocsysinit.html
這是一個以 Debian 為中心的 wiki,它也可能有用:
http://wiki.debian.org/LSBInitScripts
您通常將 pid 文件儲存在 /var/run 下的某個位置,然後在停止時顯式終止該命令。