【问题标题】:Bash script run from cron从 cron 运行的 Bash 脚本
【发布时间】:2013-11-26 09:53:53
【问题描述】:

我有以下 bash 脚本:

#!/bin/bash
src="/home/user/testingscript"
for dir in $(ls "$src")
do
find ${src}/${dir}/ -type f -mtime +31 delete
done

如果我从终端执行它,它运行良好,但是一旦我像这样将它放在 crontab 中:

* * * * * /bin/bash /home/user/script/mailboxclean.sh >> /home/user/mailboxcleanup.log 2>&1

或作为:

* * * * * /home/user/script/mailboxclean.sh

它没有运行。

我在 syslog 中没有看到任何反馈,除了脚本已执行,并且在我正在重定向的 mailboxcleanup.log 中,我看到以下内容并没有真正帮助:

/home/user/mailboxcleanup.log: 1: /home/user/mailboxcleanup.log: /bin/sh:: not found

有什么想法吗?

谢谢

【问题讨论】:

  • 奇怪的是你有#!/bin/bash,你用/bin/bash打电话然后你收到/bin/sh错误信息。
  • 与问题无关,但应将for dir in $(ls "$src"); do find ${src}/${dir}/ -type f ....改为for dir in "${src}"/*/ do ; find "${dir}" -type f ....
  • @fedorqui:也许 bash 不在 /bin 中? ... ^^ 那么 sh 会抱怨找不到它来执行脚本? OR 这是一个 /etc/crontab 并且 "/bin/bash" 被视为用户,无法找到并且一些奇怪的后果是错误消息。
  • 不应该是-delete 而不是delete 吗?

标签: bash ubuntu cron


【解决方案1】:

这取决于你把脚本放在哪里。

如果你希望它通过 /etc/crontab 运行:你需要在命令前的第 6 个参数,指定用户!

 * * * * * theuser /home/user/script/mailboxclean.sh

如果您使用 crontab -e 将它放在某人(root 或用户)的 crontab 中

 * * * * * /home/user/script/mailboxclean.sh

(即没有第 6 个参数,因为用户是已知的)

请注意,如果您希望通过将其放在 /etc/cron.*/ 下使其每天/每周/每月运行,则需要删除扩展名(即,将其命名为 mailboxclean),否则它将简单被忽略

最常见的差异原因是脚本在通过 cron 运行时缺少一些环境变量(或放置在 /etc/cron.* 目录下)...检查这一点(您可以添加:echo "=== set: ============ " ; set ; echo "=== env: ============ " ; env例如,在调试时在脚本的开头。或者只是确保您设置正确的所有内容


与问题无关,但你应该改变

for dir in $(ls "$src"); do find ${src}/${dir}/ -type f ....

for dir in "${src}"/*/ ; do find "${dir}" -type f ....

(请参阅http://mywiki.wooledge.org/BashPitfalls 了解有关此内容和许多其他内容的信息(当您学习 bash 脚本时,他们网站的其余部分也很棒))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-22
    • 2017-05-28
    • 2011-08-10
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多