当 cron 运行时,bash 脚本中的一个特定命令不起作用,所有其他命令都可以

Posted

技术标签:

【中文标题】当 cron 运行时,bash 脚本中的一个特定命令不起作用,所有其他命令都可以【英文标题】:one particular command in bash script doesn't work when run by cron, all other commands do 【发布时间】:2014-07-18 10:45:50 【问题描述】:

我有一个 bash 脚本,它运行一些命令,包括 rsync 和下面的这个

rm -f $(ls -1t /nas/backups | tail -n +161)

如果我自己在 cli 上执行脚本,所有命令都可以工作。但是,如果由 cron 运行,所有命令都可以工作,但上述命令除外。

不知道为什么。 /nas/backups 中的文件归 root 所有,但 cron 以 root 身份运行。

有什么想法吗?谢谢

【问题讨论】:

你可以通过echo "$USER" >> /some/file来验证你的脚本是否真的以root身份运行。也试试echo "$(ls -1t /nas/backups | tail -n +161)" >> /some/file。运行后检查文件。 附带说明,rm -f $(ls -1t /nas/backups ... 是相当不安全的,如果某些文件名中有(或可能有 - 在未确定的将来)空格。最糟糕的是,如果您的目录中有一个名为 whatever -r 的文件(由于命运的意外和相当不幸的转折),会附加什么? 除此之外,像( IFS=$'\n'; for file in $(ls -t /nas/backups | tail -n +161); do rm -f -- "$file"; done ) 这样的东西会更可取,尽管仍然会破坏包含 EOL 的文件。虽然完全不清楚这是否是问题所在,但请尝试添加一些 -v 详细信息并将 cron 输出(包括 stderr)重定向到某处。 我很欣赏 cmets 的安全性。目前这只是在搞乱,而不是生产服务器。尽管@konsolebox 我正在将 $user 输出到 /tmp/cronuser 并且文件是空白的,但是很好的建议。因此,我认为 cron 只是因为它位于 root 的 crontab 中而以 root 身份运行似乎是不正确的 @joevallender 该变量区分大小写。它应该是$USER(全大写)。 $user 可能会评估为无。也可以考虑$HOME 【参考方案1】:

好的。所以我是个假人。

我的ls 命令返回文件名列表,而不是文件路径!并且 cron 没有在正确的工作目录中运行。

【讨论】:

以上是关于当 cron 运行时,bash 脚本中的一个特定命令不起作用,所有其他命令都可以的主要内容,如果未能解决你的问题,请参考以下文章

Cron 无法运行 bash 脚本

Docker容器crontab未运行[重复]

Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行

如何创建一个 cron 作业来运行 ruby​​ 脚本?

将 cron 选项卡设置为工作日的特定时间

仅提取特定文件名然后将其用于变量的 Bash 脚本