Тройная команда сокращает строки?
У меня есть такой код:
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 [ $(wc -l </home/itadmin/.curator/history.txt) -ge 2 ]; then mail -s 'Snapshot Status' xyz@abc.com; 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' xyz@abc.com < /home/itadmin/.curator/history.txt; fi
Я не знаю способ сделать это без использования промежуточного файла. Ответ на отправку почты из командной строки, если тело не пустое, предлагает использовать ifne
утилита для особого случая пустого / непустого ввода.