Как приостановить/возобновить cronjob, если Вы уже работаете?

Я попробовал это решение предотвратить дубликат cronjob от выполнения.

30,31 12 * * * /usr/bin/flock -n /tmp/my.lockfile ~/Desktop/test.sh >> ~/Desktop/test.log 2>&1

и сценарий test.sh имеет

#!/bin/bash

for i in {1..40};do
    echo "hello$i"
    sleep 2
done

Сценарий test.sh успешно препятствовавший работать в 12:31, но это останавливается, и я хочу возобновить его. Как я могу заставить его только приостановить, не остановленный и возобновиться назад? Действительно ли это возможно?

3
задан 8 January 2019 в 10:25

1 ответ

Можно добавить тест в начале сценария, чтобы проверить, существуют ли, другой рано запустил экземпляры сценария и в то время как это верно, что текущий экземпляр будет спать. Что-то как этот:

while ps aux | grep -v 'grep' | grep "$0" | sed -e "/$$/p" -e "/$$/,$ d" | grep -vq "$$"
do sleep 1
done

Где:

  • переменная $0 содержит название сценария (и путь выполнения);

  • переменная $$ содержит PID текущего рабочего экземпляра сценария;

  • ps aux - произведите текущие процессы;

  • grep -v 'grep' - сохраните строки, который содержит grep в выводе предыдущей команды;

  • grep "$0" - вывод только строки, которые связаны с текущим названием сценария;

  • sed -e "/$$/p" -e "/$$/,$ d" - удалите более новые экземпляры сценария; удалите все строки после строки, которая содержит PID текущего экземпляра;

  • grep -vq "$$" - это - фактический тест -q это возвратится 0 (верный - существует по крайней мере один более старый экземпляр сценария), или 1 (ложь - по-видимому, это - новейший существующий экземпляр сценария), когда строка с PID текущего экземпляра удалена -v.

Вот полный пример:

#!/bin/bash

while ps aux | grep -v 'grep' | grep "$0" | sed -e "/$$/p" -e "/$$/,$ d" | grep -vq "$$"
do
        sleep 1
        echo -n '.'
done

date +"%T"

for i in {1..5};do
    echo "hello$i"
    sleep 2
done

Вот тест, который я сделал:

enter image description here

Кроме того, можно создать сценарий средства запуска, который выполнит фактический сценарий вышеупомянутым способом.

$ cat ~/Desktop/test-cron-launcher.sh 
#!/bin/bash

LAUNCH_TIME="$(date +"%T")"

while ps aux | grep -v 'grep' | grep "$0" | sed -e "/$$/p" -e "/$$/,$ d" | grep -vq "$$"
do sleep 1
done

echo "Job from $LAUNCH_TIME begin at $(date +"%T")"

. "$HOME/Desktop/test.sh"
$ cat ~/Desktop/test.sh 
#!/bin/bash
for i in {1..40};do
    echo "hello$i"
    sleep 2
done
$ crontab -l | grep 'test'
30,31 12 * * * "$HOME/Desktop/test-cron-launcher.sh" >> "$HOME/Desktop/test.log" 2>&1

Чтение также:

2
ответ дан 1 December 2019 в 16:50

Другие вопросы по тегам:

Похожие вопросы: