Я попробовал это решение предотвратить дубликат 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, но это останавливается, и я хочу возобновить его. Как я могу заставить его только приостановить, не остановленный и возобновиться назад? Действительно ли это возможно?
Можно добавить тест в начале сценария, чтобы проверить, существуют ли, другой рано запустил экземпляры сценария и в то время как это верно, что текущий экземпляр будет спать. Что-то как этот:
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
Вот тест, который я сделал:
Кроме того, можно создать сценарий средства запуска, который выполнит фактический сценарий вышеупомянутым способом.
$ 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
Чтение также: