Ubuntu 18.04 在 MacOS 10.14.3 上作为客户机运行。虚拟机管理程序:VMWare Fusion 10
目标:每分钟将日期/时间附加到文件中
状态:脚本每分钟运行一次,在文本文件中插入一个空白的新行。不包括日期。这就是问题所在
当从命令行运行脚本时,使用与 crontab 上的帐户相同的帐户,日期会添加到文件中,没有问题。
明显的问题:从命令行将日期回显到文件,但来自 cron 的相同命令不会产生日期
这是 cron 中每分钟运行的脚本。
#!/bin/bash
#append_date_to_file.sh
target_file='/home/dan/timestamps'
echo $(date) >> $target_file
这是 cron 条目
crontab -e
PATH=/bin/bash:
* * * * * /home/dan/append_date_to_file.sh
结果从命令行运行三次,然后查看目标文件:
$ cat /home/dan/timestamps
Sat Aug 17 18:31:12 CDT 2019
Sat Aug 17 18:31:33 CDT 2019
Sat Aug 17 18:31:34 CDT 2019
然后等待三分钟,让它在 cron 中运行三次,然后查看目标文件:(与上面相同,除了日期后有三个新的空白行。)
考虑的问题……文件权限。为了解决这个问题,下面列出了文件权限和所有者:组:
-rwxrwxrwx 1 dan dan 157 Aug 17 18:43 timestamps*
.. 脚本未在 cron 中运行。已解决:文件上的修改时间每分钟开始时都会更改,并且文件同时会获得一个新的空白行,这证明脚本正在运行。
我无法想到当脚本由 cron 而不是命令行运行时日期未添加到文件中的原因。
任何想法,将不胜感激。
谢谢。
答案1
PATH
应该是搜索命令的目录列表,而不是特定命令的名称,因此PATH=/bin/bash:
是不正确的,您可以通过在交互式 shell 中运行以下命令来验证:
$ PATH=/bin/bash: date
Command 'date' is available in '/bin/date'
The command could not be located because '/bin' is not included in the PATH environment variable.
date: command not found
虽然cron
在相当有限的环境中运行作业(您可以通过运行printenv > /tmp/cronenv
或类似 cron 作业来检查具体内容),但它的默认值包括shell和可执行文件的PATH
位置- 因此根本不需要修改它,只需使用/usr/bin
/bin
bash
date
* * * * * /home/dan/append_date_to_file.sh
(当然前提是它/home/dan/append_date_to_file.sh
是可执行的)。
顺便说一句,您不需要命令替换echo $(date)
- 简单的命令date
就可以实现相同的结果。
答案2
cron
有时可能会相当$PATH
无知。许多人只是在命令前加上命令的路径。对于命令date
,使用以下三个命令之一找到它的路径:
$ which date
/bin/date
$ type -a date
date is /bin/date
$ command -v date
/bin/date
因此,请将脚本从:
$(date)
到:
$(/bin/date)
您可以通过替换以下内容来缩短脚本:
target_file='/home/dan/timestamps'
echo $(/bin/date) >> $target_file
和:
/bin/date >> /home/dan/timestamps