Использование файла или стандартного ввода для настройки crontab вновь создает (перезаписывает )содержимое, а не добавляет к тому, что уже может существовать.
Одним из простых решений было бы записать каждую из ваших записей в один файл:
crontab -u root -l | grep -w "$VAR" | crontab -u root - && \
{ crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } \
>> cron-entry-file
Затем, когда вы соберете все записи, сделайте это только один раз:
crontab -u root cron-entry-file
Если вы создаете свои записи в разных сценариях и/или в разное время, то каждый раз вам нужно будет выполнять:crontab -l > cron-entry-file
для сохранения текущих настроек, затем выполните шаги, описанные выше. (Будем надеяться, что кто-нибудь предложит более изящное решение, но этот -метод грубой силы должен сработать.)
Редактировать
Поскольку ваш сценарий не так прост, как я думал, когда изначально писал вышеизложенное, рассмотрите возможность манипулирования файлом crontab напрямую. Это обычный файл (в каталоге /var/cron/tabs/{username}, например ). Возможно, стоит сначала прочитать это:https://serverfault.com/questions/347318/is-it-bad-to-edit-cron-file-manually
Используйте /usr/bin/time
вместо оболочки, созданной -в time
. Затем запишите stderr
в отдельный файл из stdout
вашей команды application
. Поскольку прошедшее реальное время является первым словом вывода time
, его легко получить с помощью awk
.
grep
имеет переключатель -q
, поэтому нет необходимости перенаправлять на /dev/null
.
Наконец, sleep
принимает аргумент за секунды, поэтому я не думаю, что sleep 5m
будет делать то, что вы хотите. Однако синтаксис принят, поэтому я оставил его в силе.
for n in {1..1000}
do
/usr/bin/time application login -u "user" \
-p '******' "host.domain.com" > login.out 2>time.out
realtime=$(awk '{print $1}' time.out)
echo -n "$(date) real $realtime " >> output.txt
if grep -q "Succeeded" login.out; then
echo "Succeeded" >> output.txt
else
echo "Failed" >> output.txt
fi
sleep 5m
done
Не выполняйте команду grep/awk/sed, просто используйте параметры формата времени, например. time -f "%e" command
выведет только прошедшее реальное количество секунд, которое потребовалось команде, и ТОЛЬКО это.