Bash

crontab 環境

  • January 16, 2015

我編寫了各種腳本來啟動 Java 伺服器應用程序,這些應用程序通常在關閉之前執行 24 小時(通過呼叫具有不同參數的相同腳本)。

該腳本依賴於文件中定義的環境變數:~/<user>.env,我從.bashrc.

從命令行呼叫腳本時這很好用,但是如果我想將腳本添加為 crontab 條目,我會遇到.bashrc未讀取的問題。

我的問題:解決這個問題的最佳實踐方法是什麼?我意識到我可以定義一個 crontab 條目,例如:

* * * * 1-5 /usr/bin/bash -c '. /home/myuser/myuser.env && /home/myuser/scripts/myscript.sh'

…但這看起來很醜陋。或者,我可以myuser.env在每個腳本的開頭獲取源,但這將成為維護的噩夢。

任何幫助表示讚賞。

實際上,我通過在我的 bash 命令中添加“-l”(–login)標誌發現了一個相當優雅的解決方案,這會導致它獲取所有登錄文件,包括 .bashrc。因此我的 crontab 命令很簡單:

* * * * 1-5 /usr/bin/bash -lc '/mnt/group/core/deploy/scripts/test.sh' > /dev/null 2>&1

我通常用一個簡短的 cron 包裝腳本來解決這個問題:

#!/bin/bash
[ -r $HOME/.bashrc ] && . $HOME/.bashrc
[ -r $HOME/.profile ] && . $HOME/.profile
exec "$@"

然後只需在 crontab 中使用您的包裝器為命令添加前綴:

* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh
* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myotherscript.sh

某些版本的 cron允許您直接在 crontab 中設置變數。不幸的是,我不能在工作中使用它們。

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