Linux

正確的 Bash 守護程序腳本創建

  • May 21, 2015

在 Ubuntu 上,我將骨架複製/etc/init.d/為一個新文件,並使其“全部”可執行(就像該目錄中的其他文件一樣)。在其中,我創建了一個“foo”,它只是另一個 Bash 腳本/usr/sbin,但它的特殊之處在於它位於一個循環中,等待來自 PHP 網頁的命名管道連接。(更多細節在這裡,雖然這是一個副話題。)

因為它必須在命名管道連接上循環等待,這顯然會在命令行中掛起命令。沒什麼大不了的,因為我實際上希望它掛起並等待新的連接。但我不希望它發生在前台。所以,我讓 start-stop-daemon 使用 –background 選項。

好的,它適用於啟動和狀態,但停止不起作用——它將命令以及cat /tmp/pipe我在/usr/sbin/fooBash 腳本中的命令留在記憶體中。他們警告說,在 start-stop-daemon 命令上使用 –background 選項時可能會發生這種情況。

問題

那麼,當 /usr/sbin/foo 執行時正確停止 /usr/sbin/foostart-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 下的某個位置,然後在停止時顯式終止該命令。

引用自:https://serverfault.com/questions/277707