从终端执行时,脚本可以正常工作,但是从 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