У меня есть сценарии Cron Job, которые запускаются каждые 4 минуты. В редких случаях сценарий не завершается в течение 4 минут. Это вызывает проблемы.
Как я могу выполнить проверку, что если предыдущий скрипт не закончен, пропустите текущий прогон
Ожидаемое поведение:
10:00 : Script A starts
10:04 : Script A2 starts - it finds that script A was not finish so this script aborts. Simply finish without doing nothing.
10:06 : Script A finish
10:08 : Script A3 starts - no other scripts running so it continue
Примечание: A, A2, A3 - это один и тот же сценарий (только в разное время)! Он также не должен учитывать другие сценарии, которые могут работать также
Существует два основных подхода:
вывести скрипт, если он обнаруживает другой экземпляр сам. Просто добавьте эти строки в начало вашего скрипта:if [ $(pgrep -c "${0##*/}") -gt 1 ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
$0 - это имя скрипта, а ${0##*/} - имя скрипта со всем, пока последний / не удалится (поэтому /path/to/script.sh становится script.sh). Это означает, что если у вас есть другой, несвязанный скрипт с тем же именем, он все равно будет обнаружен. с другой стороны, это также означает, что он будет работать, даже если вы вызываете скрипт из символической ссылки. Какой из них вы предпочитаете, зависит от вашего варианта использования. Используйте файл блокировки и выйдите из сценария, если файл существует: #!/bin/bash
if [ -e "/tmp/i.am.running" ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
else
touch "/tmp/i.am.running"
fi
## The rest of the script goes here
rm "/tmp/i.am.running"
Существует два основных подхода:
вывести скрипт, если он обнаруживает другой экземпляр сам. Просто добавьте эти строки в начало вашего скрипта:if [ $(pgrep -c "${0##*/}") -gt 1 ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
$0 - это имя скрипта, а ${0##*/} - имя скрипта со всем, пока последний / не удалится (поэтому /path/to/script.sh становится script.sh). Это означает, что если у вас есть другой, несвязанный скрипт с тем же именем, он все равно будет обнаружен. с другой стороны, это также означает, что он будет работать, даже если вы вызываете скрипт из символической ссылки. Какой из них вы предпочитаете, зависит от вашего варианта использования. Используйте файл блокировки и выйдите из сценария, если файл существует: #!/bin/bash
if [ -e "/tmp/i.am.running" ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
else
touch "/tmp/i.am.running"
fi
## The rest of the script goes here
rm "/tmp/i.am.running"
Существует два основных подхода:
вывести скрипт, если он обнаруживает другой экземпляр сам. Просто добавьте эти строки в начало вашего скрипта:if [ $(pgrep -c "${0##*/}") -gt 1 ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
$0 - это имя скрипта, а ${0##*/} - имя скрипта со всем, пока последний / не удалится (поэтому /path/to/script.sh становится script.sh). Это означает, что если у вас есть другой, несвязанный скрипт с тем же именем, он все равно будет обнаружен. с другой стороны, это также означает, что он будет работать, даже если вы вызываете скрипт из символической ссылки. Какой из них вы предпочитаете, зависит от вашего варианта использования. Используйте файл блокировки и выйдите из сценария, если файл существует: #!/bin/bash
if [ -e "/tmp/i.am.running" ]; then
echo "Another instance of the script is running. Aborting."
exit
fi
else
touch "/tmp/i.am.running"
fi
## The rest of the script goes here
rm "/tmp/i.am.running"