我想定义一个这样的 cronjob:
@hourly /path/to/my/script.sh &> "/path/to/my/logs/$(date +%Y-%m-%d_%H-%M-%S.txt)"
因此它应该将脚本的输出写入日志文件。现在我想制作第二个脚本(最好使用 PHP),该脚本读取所有文件/path/to/my/logs/
并通过邮件发送文件。创建这样的脚本应该不成问题,但我想知道如何检测创建文件的 cronjob 是否已完成并且不再写入文件。我不想发送已创建但 cronjob 仍在写入的文件。
有没有通用的方法来检测这一点,以及在 PHP 中有没有一种方法可以检测这一点?
答案1
您可能需要使用一个方便的小工具,例如Crontab 生成器构建作业定义。要按小时运行作业,您可以执行以下操作:
0 * * * * /path/to/script.sh > /path/to/output/log_$(date +\%Y-\%m-\%d).txt >/dev/null 2>&1
从那里,你可以让你的 PHP 脚本使用功能filemtime
获取文件上次修改的时间。如果 cron 作业需要 X 秒才能运行,并且输出文件的修改日期在 X+60 秒内(或您满意的任何数字),那么您可以让脚本读取数据并按您希望的方式处理它。
答案2
通过cron
、运行的作业crontab
不会在桌面上的同一运行时环境中运行。您的任何PATH
更改或其他环境变量设置都不会自动传播到您的cron
作业。例如,没有$DISPLAY
,因此 GUI 程序需要特殊处理(阅读man xhost
)。
cron
人们可以在crontab
文件 Read中为所有作业设置环境变量man 5 crontab
。
echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
查看每个环境中的结果 。
由于command
该行的一部分crontab
默认由 解释/bin/sh
,其语法比 更简单/bin/bash
,因此我建议command
调用一个bash
脚本(可执行、已安装、以 开头#!/bin/bash
)来设置环境,然后调用所需的程序。