Shell

在非互動式外殼中執行腳本?

  • December 20, 2021

我有一個執行腳本的 cron 作業。當我通過互動式外殼(ssh’ed to bash)執行腳本時,它工作正常。當腳本通過 cron 自行執行時,它會失敗。

我的猜測是它使用了互動式 shell 中設置的一些環境變數。我將對腳本進行故障排除並刪除這些。

進行更改後,我知道我可以在 cron 中將腳本排隊以使其正常執行,但是有沒有一種方法可以從命令行執行腳本,但告訴它像從 cron 一樣執行 -即在非互動環境中?

從 cron 執行命令和在命令行上執行的主要區別是:

  • cron 可能正在使用不同的 shell(通常/bin/sh);
  • cron 肯定是在一個小環境中執行(哪些取決於 cron 實現,因此請查看cron(8)orcrontab(5)手冊頁;通常只有HOME、也許SHELL、也許LOGNAME、也許USER和一個小的PATH);
  • cron 對%字元進行特殊處理(變成換行符);
  • cron 作業無需終端或圖形環境即可執行。

以下呼叫將執行 shell 片段,就像從 cron 呼叫它一樣。我假設該片段不包含字元'%.

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

另請參閱從 cron 執行 sh 腳本,這可能有助於解決您的問題。

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