当 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 脚本中的一个特定命令不起作用,所有其他命令都可以的主要内容,如果未能解决你的问题,请参考以下文章