使用 Cron 和 Bash Shell 脚本将 $(date) 写入文件

使用 Cron 和 Bash Shell 脚本将 $(date) 写入文件

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/binbashdate

* * * * *       /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

相关内容