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



我使用的是EC2实例,crontab和Slack清洁器来删除超过48小时的所有松弛消息。为此,我创建了Delete_slack.sh(我已删除了我的Slack API令牌)

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

然后,我创建了一个克朗塔布线以每分钟运行它(一旦它起作用,我将每天更改一次时间),然后将结果吐出到日志文件中:

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

要测试,我在外壳中运行了sh /home/ubuntu/delete_slack/delete_slack.sh >> /var/log/delete_slack.log 2>&1,并且可以正常运行。但是,当我让crontab运行时,我会在日志文件中出现错误:

/home/ubuntu/delete_slack/delete_slack.sh: 3: /home/ubuntu/delete_slack/delete_slack.sh: slack-cleaner: not found

有什么想法吗?我整个下午都在猛击我的头。

听起来像您通过cron获得的路径,并且通过登录的路径不同。

要么在脚本中设置路径,要么使用绝对路径到slack-cleaner

该路径告诉外壳哪些目录要搜索可执行文件(包括脚本)。您可以echo $PATH将您的路径与一个Cron提供的路径进行比较,并确认这是问题。

如果使用绝对路径起作用,那是最简单的,但是如果slack-cleaner使用其他EXEX本身,则设置路径可能更好。

如果要使用"修改路径"方法,则需要将正确的路径附加到现有路径,而不是完全覆盖它。即export PATH=$PATH:/path/to/slack-cleaner-dir。您始终可以使用which slack-cleaner查找正确的路径。注意:您希望没有附加" Slack-cleaner"的目录到末尾。

始终在Crons中使用完整的路径,您将节省很多时间。如果您不喜欢export PATH=...,则只需使用/path/to/slack-cleaner-dir

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

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

我读到您有点陌生,这里只是有关个人资料的更多解释:当您与用户在Shell中连接时,该配置文件是自动加载的文件。该文件隐藏在您的主目录中,要查看,您可以启动:

ls -la ~

如果您在bash中,则文件将命名为.bash_profile,如果您在shellksh中,则将命名为.profile

希望它能有所帮助!

最新更新