為什麼我不能直接從 cron 啟動程式?

為什麼我不能直接從 cron 啟動程式?

我目前正在設定一個運行 Debian wheezy 的樹莓派作為 IRC 伺服器。它在啟動時以普通用戶身份運行兩個程式 - ngircd 和 atheme。

ngircd 和 atheme 都登入/var/log/syslog

ngircd 從可執行檔( ) 本身啟動/usr/local/sbin/ngircd ,Atheme ( ) 也是如此/home/user/atheme/bin/atheme-services。作為用戶從終端手動啟動程序沒有任何問題。

當我嘗試從 cron 啟動 ngircd(使用其安裝位置)時,它根本沒有啟動 -/var/log/syslog說 cron 作業已運行,但沒有任何反應,沒有錯誤訊息,也沒有任何 ngirc 相關日誌。主題開始很好。

但是,如果我創建一個除了運行 ngird (使用我之前使用的相同路徑)之外什麼也不做的腳本,並將其添加到 cron 中,它就可以正常工作(就像直接運行它一樣)。為什麼 ngircd 不從 cron 啟動?

這不是一個大問題,但它確實使系統比我想要的稍微混亂一些。這兩個程序的行為不同也很奇怪

答案1

我沒有評論的權限,所以我不能要求澄清,但我建議從 initscript 或 rc.local 運行守護進程,而不是從 cron 運行。 cron通常用來執行事情在某個時間,定期。處理守護程序和服務通常是您的工作初始化系統

若要在啟動時以普通使用者身分執行某些內容:

將其添加到/etc/rc.local:

/bin/su -c '/path/to/your/executable args &' -s /bin/bash username >/dev/null 2>&1

答案2

Cron 運行的行為與

sudo - user /path/to/command

或者

su user
/path/to/command

如果你想檢查你的命令是否執行,你必須以這種方式測試它。

您可以使用以下指令編輯 user-crontab

crontab -e

或系統範圍的 crontab 作為

nano /etc/crontab

或是你最喜歡的編輯器,除了sudo如有必要,請在前面加上)。請注意,這兩個 crontab 在語法上有所不同,因為系統範圍的 crontab 在執行時間和命令之間有一個額外的列,用於指定執行命令的使用者。您希望將執行時間設定為@reboot

@reboot user /usr/local/sbin/ngircd
@reboot user /home/user/atheme/bin/atheme-services

user如果您正在使用 編輯使用者 crontab,只需刪除該字即可crontab -e

作為替代方案,您可以使用 System V 的 initscripts 或 systemd 的服務控製文件,具體取決於您擁有的系統。

相關內容