我有这样的代码:
54 08 * * * /usr/local/bin/curator --dry-run --config /home/itadmin/.curator/curator.yml /home/itadmin/.curator/daily.yml 2>&1 | /usr/bin/tee -a /home/itadmin/.curator/logs.txt | /usr/bin/tee /home/itadmin/.curator/history.txt | if [ $(wc -l </home/itadmin/.curator/history.txt) -ge 2 ]; then mail -s 'Snapshot Status' [email protected]; fi
我正在做的是将 cron 的输出发送到 logs.txt 以供历史记录目的,并将其发送到 history.txt,其中 if 条件将起作用。
实际上 cron 输出是这样的
2017-05-17 08:33:01,395 INFO Preparing Action ID: 1, "snapshot"
2017-05-17 08:33:01,404 INFO Master-only flag detected. Connected to non-master node. Aborting.
但是我在 logs.txt 中得到的是
2017-05-17 08:54:01,427 INFO Preparing Action ID: 1, "snapshot"
在 history.txt 文件中我什么也没有得到
但是当我删除 if 命令时这些工作正常(即。if [ $(wc -l </home/itadmin/.curator/history.txt) -ge 2 ]; then mail -s 'Snapshot Status' [email protected]; fi)
我不知道为什么会发生这种情况?
谢谢
答案1
您需要将您的作业分成两个命令(如下所示),以便history.txt
在开始检查其大小之前将其关闭。
实际情况是,该if
语句查看文件的大小,在文件被截断之后但尚未写入之前。这意味着管道的最后一个组件刚刚退出,而在此之前的所有组件都随之消失SIGPIPE
。
54 08 * * * /usr/local/bin/curator --dry-run --config /home/itadmin/.curator/curator.yml /home/itadmin/.curator/daily.yml 2>&1 | /usr/bin/tee -a /home/itadmin/.curator/logs.txt > /home/itadmin/.curator/history.txt; if [ $(wc -l </home/itadmin/.curator/history.txt) -ge 2 ]; then mail -s 'Snapshot Status' [email protected] < /home/itadmin/.curator/history.txt; fi
我不知道有没有不使用中间文件来实现这一点的方法。如果正文不为空,则从命令行发送邮件建议使用该ifne
实用程序来处理空/非空输入的特殊情况。