У меня такой код:
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' xyz@abc.com; 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' xyz@abc.com; fi)
.
Я не знаю, почему это происходит?
СПАСИБО
Вам нужно разделить вашу работу на две команды (как показано ниже), чтобы 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' xyz@abc.com < /home/itadmin/.curator/history.txt; fi
Я не знаю, как сделать это без использования промежуточного файла. Ответ на Отправка почты из командной строки, если тело не пусто предлагает использовать ifne
утилита для особого случая пустого / непустого ввода.