Services

start-stop-daemon 和使用 & 執行有什麼區別?

  • August 17, 2016

我正在 /etc/init.d 中設置服務。我正在查看那裡的各種腳本,有些是用實現的,有些是start-stop-daemon .../path/to/script &.

他們都將pid保存在一個文件中並進行一些檢查。

什麼是最佳實踐,有什麼區別,這裡有什麼重要的了解……?(一般來說)

在我的特殊情況下,我在 java 中有一個簡單的輕量級 localhost http 伺服器,應用程序將每隔一小時左右呼叫一次,它只是給出一個愚蠢的隨機數(這裡沒有更多細節,我只是說它不使用文件系統或執行緒或任何復雜的東西,以防我的問題出現這種情況)

謝謝

後台作業(即以 & 開頭)仍然將其標準輸入、標準輸出和標準錯誤連接到啟動它的終端。它可能會突然向終端寫入(例如錯誤消息)(“干擾”前台)或暫停等待鍵盤輸入(您必須先將其置於前台)。您當然可以將 stdout 和 stderr 重定向到文件或 /dev/null 以防止後台作業寫入終端。

後台作業也可以放在前台 - 例如。目前前台作業停止,fg(foreground) 命令用於將後台作業置於前台。後台作業也可以通過來自終端的信號到達 - 例如。SIGHUP 關閉終端時,通常會結束(大多數)在終端中啟動的程序。

一個守護程序——比如由 init.d 自動啟動的守護程序,但也可以從終端手動啟動——另一方面,它在與任何終端斷開連接的情況下執行。即使它是從終端手動啟動的,守護程序也會與終端斷開連接,因此它既不能寫入(stdout,stderr)也不能讀取(stdin)它。它對終端“自動”發送的信號也“免疫”。(儘管您可以使用 向它發送信號kill -signal pid)。

“後台”和“前台”是指程序對某個終端的狀態——不管它是不是目前控制終端的程序。由於守護程序沒有連接到終端(但已經以各種方式與終端斷開連接),因此不能說它在後台執行。守護程序只是在不與終端關聯的情況下執行的程序——既不在前台也不在後台。

如果您使用ps顯示程序使用哪個終端的選項,您將看到前台和後台作業都與終端相關聯(例如 tty2)。另一方面,守護程序有一個“?” 在這個領域裡。

守護程序通常是這樣的,即使它們是手動啟動的。創建一個你自己的守護程序是一項相當多的工作——涉及到一些技巧來完全斷開它與終端的連接。您應該創建它自己的使用者/組來執行。如果您希望它創建文件,您通常必須使用 /tmp、/var/tmp 或 /var/run - 它通常不應該在其他任何地方擁有權限。由於它不能向終端報告錯誤,你應該讓它寫入一個日誌文件(例如,它在 /var/log 中的自己的日誌文件)。守護程序應該使用目前的 PID 在 /var/run 中創建一個條目,並且應該檢查它的另一個實例是否已經在執行。它應該在適用的情況下尊重文件或設備的鎖 (/var/lock)。它應該通過重新載入它的配置文件並使用更新的配置來響應 SIGHUP。

另一點是大多數守護程序的工作方式。守護程序通常是一個執行檔,可以以兩種不同模式之一執行;取決於它是原始守護程序 - 父程序 - 在引導時啟動還是手動啟動……還是由該父程序生成的子程序。父程序通常只是坐下來等待某個事件——特定的時間、經過的時間、連接到特定網路埠的嘗試,或者其他什麼。發生這種情況時,父程序會創建一個與自身相同的子程序(使用 fork() 系統呼叫) - 並立即返回等待另一個事件(並可能產生更多子程序)。真正完成工作的是子程序——比如同步磁碟、執行命令(例如cron)或建立網路連接(例如sshdftpd)。父程序和子程序之間的唯一區別是它們獲得了不同的 PID,並且子程序的 PPID(Parent-PID)是父程序的 PID——這可以用來確定程序是父程序還是子程序。因此,同一個程序必須能夠以兩種模式執行——作為等待(和產卵)的父程序,或者作為工作的子程序。

雖然編寫一個守護程序並不難,但也不是微不足道的——正如您所看到的,您必須首先了解很多“技巧”。一般來說,與其他替代方案相比,我認為編寫一個守護程序需要付出很多努力而收穫卻很少:

使用nohupdisown在後台作業上通常是一個很好的選擇,因為即使終端關閉,它也能讓程序保持活動狀態。將 stdout 和 stderr 重定向到文件或 /dev/null 通常是個好主意。對於更具互動性的程序,screen這是一種將某些東西“收起來”直到您需要它的好方法。 atbatchcrontab值得考慮。

引用自:https://unix.stackexchange.com/questions/97929