crontab 上的命令不起作用,但如果我在终端上运行相同的命令,它就会起作用。
[root@ds backup]# crontab -l
* * * * * find /opt/backup -type f -regextype posix-extended -not -regex '.*('$(sed 's/ /|/g' <<<$(echo {6..0} | xargs -I{} -d ' ' date --date={}' days ago' +"%Y%m%d" | xargs echo))').*' &> /home/ocdn_adm/f.txt
#
#
2 分钟后,我运行这些命令,
[root@ds backup]# cat /home/ocdn_adm/f.txt
cat: /home/ocdn_adm/f.txt: No such file or directory
好像 cron 命令无法运行
但是如果我在终端上运行相同的命令
[root@ds backup]# find /opt/backup -type f -regextype posix-extended -not -regex '.*('$(sed 's/ /|/g' <<<$(echo {6..0} | xargs -I{} -d ' ' date --date={}' days ago' +"%Y%m%d" | xargs echo))').*' &> /home/ocdn_adm/f.txt
[root@ds backup]# cat /home/ocdn_adm/f.txt
/opt/backup/conf-backup-20180407.tar.gz
它有效,很奇怪。我可以让命令在 crontab 上运行吗?
答案1
请注意,默认情况下cron
不使用bash
。您必须指定使用的 shell 以及PATH
.例如:
SHELL=/bin/bash
PATH=~/bin:~/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin
* * * * * find /opt/backup -type f -regextype posix-extended -not -regex '.*('$(sed 's/ /|/g' <<<$(echo {6..0} | xargs -I{} -d ' ' date --date={}' days ago' +"\%Y\%m\%d" | xargs echo))').*' &> /home/ocdn_adm/f.txt
当我们这样做时,我还想添加有关显示的信息,以便依赖于 X 的命令可以正常工作:
DISPLAY=:0
要调试 cron 命令,您可以查看 syslog、有关它们运行的信息以及可能的错误:
tail -f /var/log/syslog
正确命令的输出示例xset m 1 1
:
May 11 14:29:01 cage CRON[25152]: (Ctrl-C) CMD (xset m 1 1)