从 crontab 运行脚本时 $USER 环境变量未定义

从 crontab 运行脚本时 $USER 环境变量未定义

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

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

我将其保存script.sh在我的主目录中。如果我手动运行它,则cron.txt包含我的用户名,正如我所期望的那样。

然后我在 crontab 中添加一行:

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

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

为什么$USER从 crontab 运行脚本时没有定义?

答案1

当 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

相关内容