Cron

從 crontab 執行腳本時 $USER 環境變數未定義

  • October 25, 2021

我創建了一個簡單的腳本來檢查從 crontab 執行時環境變數的值:

#!bin/bash
echo $USER > cron.txt

我把它保存script.sh在我的主目錄中。如果我手動執行它,cron.txt包含我的使用者名,正如我所期望的那樣。

然後我在我的 crontab 中添加一行:

*/1 * * * * ./script.sh

我再次希望cron.txt包含我的使用者名,但現在它只是空的。

為什麼$USER從 crontab 執行腳本時沒有定義?

當 cron 執行您的作業時,它會在與您目前的 shell 環境不同的環境中執行此操作。

例如,這意味著./script.sh可能找不到。

有兩種解決方案:

*/1 * * * * ( cd $HOME/mydir && ./script.sh )

或者

*/1 * * * * $HOME/mydir/script.sh

即,準確指定可以找到腳本的位置。

如果您不對腳本中的輸出文件使用絕對路徑名,則第一種選擇可能更可取。

如果您使用第二個選項,請修改您的腳本,以便您知道輸出文件的位置:

#!/bin/bash
echo "$USER" >"$HOME/mydir/cron.txt"

或者

#!/bin/bash
( cd "$HOME/mydir" && echo "$USER" >cron.txt )

請注意,該#!行必須包含正確的絕對路徑bash(您的路徑是相對路徑)。

還應注意,某些 Unices (Linux) 上的 cron 未設置USER為執行 cron 作業的使用者的使用者名。在這些系統上,在呼叫腳本時使用$LOGNAME或設置USER為:$LOGNAME

*/1 * * * * env USER=$LOGNAME $HOME/mydir/script.sh

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