$USER 环境变量未从 crontab 运行

d a*_*s y 5 cron environment-variables

我创建了一个简单的脚本来检查从 crontab 运行的环境变量。

#!bin/bash
echo $USER > cron.txt
Run Code Online (Sandbox Code Playgroud)

在主目录中保存为 script.sh。

Crontab 设置: */1 * * * * ./script.sh

如果我手动运行它,它可以工作,但不能从 crontab.Output 中显示我的用户名在 cron.txt 文件中,但它没有。

Kus*_*nda 5

当 cron 执行您的作业时,它是在与您当前的 shell 环境不同的环境中执行的。

这意味着,例如,./script.sh可能找不到。

有两种解决方案:

*/1 * * * * ( cd $HOME/mydir && ./script.sh )
Run Code Online (Sandbox Code Playgroud)

或者

*/1 * * * * $HOME/mydir/script.sh
Run Code Online (Sandbox Code Playgroud)

即,准确指定可以找到脚本的位置。

如果脚本中的输出文件不使用绝对路径名,则第一种选择可能更可取。

如果您使用第二个选项,请修改您的脚本,以便您知道输出文件的去向:

#!/bin/bash
echo "$USER" >"$HOME/mydir/cron.txt"
Run Code Online (Sandbox Code Playgroud)

或者

#!/bin/bash
( cd "$HOME/mydir" && echo "$USER" >cron.txt )
Run Code Online (Sandbox Code Playgroud)

请注意,该#!行必须包含正确的绝对路径bash(您的是相对路径)。

还应该注意的是,某些 Unices (Linux)USER上的 cron没有设置为运行 cron 作业的用户的用户名。在这些系统上,在调用脚本时$LOGNAME改用或设置USER$LOGNAME

*/1 * * * * env USER=$LOGNAME $HOME/mydir/script.sh
Run Code Online (Sandbox Code Playgroud)