从 crontab 执行时,脚本内部使用的输出重定向到文件不起作用

从 crontab 执行时,脚本内部使用的输出重定向到文件不起作用

从终端执行时,脚本可以正常工作,但是从 crontab 执行时,它会给出“(CRON)信息(未安装 MTA,丢弃输出)”信息。

以下是我的脚本内容。我有 2 个脚本和一个按顺序执行这两个脚本的主脚本。您也可以在系统中按原样创建它们以进行测试。我在这里没有写任何复杂的东西。

testpad1.sh。脚本是故意写错的

#!/bin/bash
echo "This is script one.
sleep 3

测试板2

#!/bin/bash
echo "This is script two"
sleep 3

masterpad下载

#!/bin/bash
mkdir -p logs
./testpad1.sh &> logs/testpad1.log
echo `date`
./testpad2.sh &> logs/testpad2.log
echo `date`

如您所见,脚本 masterpad.sh 将其他两个脚本的输出重定向到它们各自的日志文件。

这是 cronjob。

* * * * * /opt/scripts/masterpad.sh

通过创建 testpad1.log 和 testpad2.log 以及预期输出,从终端执行时它可以正常工作。

但如果我安排同样的时间定时任务,它给出“(CRON) 信息(未安装 MTA,丢弃输出)”错误。通过执行检查了此错误"grep CRON /var/log/syslog"

谢谢。

更新

由于评论区有位用户对这篇文章和其他文章表示怀疑,下面是输出,表明之前没有出现错误,但只有在我添加 cronjob 后才出现。这是“grep CRON /var/log/syslog”命令的先前输出。

CMD (/opt/scripts/masterpad.sh &> /opt/scripts/logs/masterpad.log)
CMD (/opt/scripts/masterpad.sh)
CRON[6656]: (CRON) info (No MTA installed, discarding output)
CRON[6733]: (padmahasa) CMD (/opt/scripts/masterpad.sh)
CRON[6732]: (CRON) info (No MTA installed, discarding output)

更新2:根据评论和已接受的答案总结答案。

要从主脚本或命令(crontab 执行)调用的其他脚本获取 STDOUT 和 STDERR,可以同时使用“&>”或更好的选项“|& tee”重定向,或者您可以使用任何其他合适的选项,如本例中所示桌子但是,要捕获主脚本或命令的 STDOUT 和 STDERR,“/absolute/path/to/script > absolute/path/to/logfile 2>&1”是唯一有效的格式。因此修改为

1. masterpad.sh

#!/bin/bash
mkdir -p logs
./testpad1.sh |& tee logs/testpad1.log
echo `date`
./testpad2.sh |& tee logs/testpad2.log
echo `date`

2. crontab 任务

* * * * * /opt/scripts/masterpad.sh > /opt/scripts/logs/masterpad.log 2>&1

謝謝大家的支持。

答案1

logs/testpad1.log根据您当前的目录,其行为会有所不同。如果cron以 root 身份运行或从终端调用脚本,其行为也会有所不同。

安全的做法(通常是纠错)是将完整路径硬编码到文件名中:

/home/me/scripts/logs/testpad1.log
/var/log/testpad1.log

相关内容