
介紹
我最近升級到 Fedora 17,並且正在習慣較新的systemctl
守護程式管理器與 shell 初始化腳本。
我的一些守護程式需要的一個功能是能夠與他們的控制台交互因為不是由進程本身啟動的不乾淨關閉可能會導致資料庫損壞。因此,執行例如systemctl stop service-name.service
可能會導致不可逆轉的資料遺失。
這些控制台透過 stdin 或類似方法讀取使用者輸入,因此我在舊作業系統上所做的就是將這些守護程式放在前台screen
,而我暫停與 的螢幕會話^A ^z
。還值得注意的是,我現在已經systemctl
在電腦重新啟動時自動執行此操作,但它仍然無法解決我試圖避免的潛在資料損壞問題。
我的問題
有沒有一種方法可以systemctl
直接與其產生的進程的控制台進行互動?我可以掛接一個進程systemctl
來存取其控制台嗎?
謝謝
你們總是給出很好的答案,所以我轉向你們!
答案1
看來您可以將其重定向到 tty。
標準輸入=
控制已執行程序的檔案描述符 0 (STDIN) 連接到的位置。採用 null、tty、tty-force、tty-fail 或 socket 之一。如果選擇 null,標準輸入將連接到 /dev/null,即進程的所有讀取嘗試都會立即導致 EOF。如果選擇 tty,標準輸入將連接到 TTY(由 TTYPath= 配置,見下文),並且執行的進程將成為終端的控制進程。如果終端機已經被另一個程序控制,則執行的程序將等待,直到目前控製程序釋放終端。tty-force 與 tty 類似,但強制執行的進程立即成為終端的控制進程,可能會從終端中刪除先前的控制進程。tty-fail 與 tty 類似,但如果終端機已經有控制進程,則執行的進程啟動失敗。套接字選項僅在套接字啟動的服務中有效,並且僅當套接字設定檔(詳細資訊請參閱 systemd.socket(5))指定單一套接字時才有效。如果設定此選項,標準輸入將連接到啟動服務的套接字,這主要用於與設計用於傳統 inetd(8) 守護程式的守護程式相容。此設定預設為空。
哦,如果這不起作用,我們將使用 Unix 套接字做一些非常複雜的事情,我相信你會的愛。
廢話,如果上面的方法不可接受,請嘗試這樣的事情:
您可以嘗試寫入它的 /proc pid 目錄。假設你的守護程式的 pid 是 2000,試著寫入 /proc/2000/fd/0
您可以將該行新增至 ExecStop= 中,這樣您就不必手動互動。