Bash脚本在shell中运行,在crontab中给出“not found”错误

时间:2017-03-01 00:21:47

标签: bash amazon-ec2 cron

我正在使用EC2实例,crontab和slack-cleaner删除超过48小时的所有Slack消息。为此,我创建了delete_slack.sh(我删除了我的松弛api令牌):

std::getline(map, fileID, ":");

然后我创建了一个crontab行来每分钟运行一次(一旦它工作,我会将时间更改为每天一次)并让cron将结果吐出到日志文件中:

for CHANNEL in random general
do
slack-cleaner --token <MY TOKEN> --message --channel $CHANNEL --user "*" --before $(date -d '48 hour ago' "+%Y%m%d") --perform
done

为了测试,我在shell中运行了* * * * * /home/ubuntu/delete_slack/delete_slack.sh >> /var/log/delete_slack.log 2>&1 ,它运行正常。但是,当我让crontab运行时,我在日志文件中出现错误:

sh /home/ubuntu/delete_slack/delete_slack.sh >> /var/log/delete_slack.log 2>&1

有什么想法吗?我整个下午一直在反对这一点。

3 个答案:

答案 0 :(得分:3)

听起来像你通过cron获得的PATH,你通过登录获得的PATH是不同的。

在脚本中设置PATH或使用slack-cleaner

的绝对路径

PATH告诉shell哪些目录要搜索可执行文件(包括脚本)。您可以echo $PATH比较您的cron给出的路径,并确认这是问题。

如果使用绝对路径有效,这是最简单的,但如果slack-cleaner本身使用其他exes,设置路径可能会更好。

如果你想去&#34;修改路径&#34;然后,您希望将正确的路径附加到现有PATH,而不是完全覆盖它。即export PATH=$PATH:/path/to/slack-cleaner-dir。您始终可以使用which slack-cleaner找出正确的路径。注意:您希望目录没有&#34;松弛清洁&#34;附在最后。

答案 1 :(得分:1)

总是在crons中使用完整路径,您将节省大量时间。 如果您不喜欢export PATH=...,请改用/path/to/slack-cleaner-dir

答案 2 :(得分:1)

在运行命令之前加载您的配置文件,使其处于与从shell启动它时完全相同的情况:

* * * * * . ~/.profile;/home/ubuntu/delete_slack/delete_slack.sh >> /var/log/delete_slack.log 2>&1

当我读到您对此有点新的时候,这里只是对该配置文件的一些解释: 当您在shell中与用户连接时,配置文件是自动加载的文件。 该文件隐藏在您的主目录中,要查看它,您可以启动:

ls -la ~

如果您在bash,则该文件将被命名为.bash_profile,如果您在shellksh,则会将其命名为.profile }

希望它有所帮助!