Дополнительно
Как проверить, если другой экземпляр мой скрипт работает
В GNU bash, начиная с версии 1.14.7(1)
У меня есть сценарий под названием "abc.sh в
"
Я должен проверить это с abc.sh только сценария...
внутри этого я написал следующее заявление
status=`ps -efww | grep -w "abc.sh" | grep -v grep | grep -v $$ | awk '{ print $2 }'`
if [ ! -z "$status" ]; then
echo "[`date`] : abc.sh : Process is already running"
exit 1;
fi
Я знаю, что это'ы не так, потому что каждый раз, когда он выходит, как он нашел свой собственный процесс в 'л. с.' как ее решить? как я могу проверить, что скрипт уже запущен или не из этого скрипта только ?
33
13
Простой способ проверить, на процессе уже выполнения команды
pidof
.Кроме того, ваш скрипт должен создать PID-файл, когда он выполняет. Это's это простое упражнение из проверки на наличие PID-файла, чтобы определить, если процесс уже запущен.
Обновление: Вопрос теперь изменилось для проверки из самого скрипта. В этом случае, мы надеемся всегда видеть по крайней мере один
abc.sh
работает. Если есть больше чем одинabc.sh тогда мы знаем, что процесс все еще выполняется. Я'd по-прежнему предлагаю использовать
pidofкоманду, которая будет возвращать 2 Пидов, если процесс был уже запущен. Вы могли бы использовать
команда grep, чтобы отфильтровать тока ПИД, петли в оболочке или даже вернуться, чтобы просто подсчитывать Пидов с
туалет`, чтобы обнаружить несколько процессов.Здесь'ы пример:
Я тебя хочу "и pidof" и способ, вот трюк: в
Где
-o параметр %цвет
рассказывает опустить пид вызова консоли или скрипта. Более подробная информация вpidof
Man-странице.Здесь's один трюк вы'll увидеть в различных местах:
Квадратные скобки вокруг
[А]
(или выбрать другую букву) предотвратитькоманда grep
найти себя. Это делаеткоманда grep -v с грэп
- это уже перебор. Я также убралкоманда grep -v С $ $ и починил
в awk` части, чтобы сделать то же самое.Кто-нибудь, пожалуйста, пристрелите меня, если я'м не так вот
Я понимаю, что команды mkdir` операция является атомарной, так что вы могли бы создать блокировку каталог
Здесь's, как я делаю это в bash-скрипт:
Это позволяет мне использовать этот фрагмент для любой bash-скрипт. Мне нужно на bash команда grep, потому что при использовании с cron, он создает еще один процесс, который выполняется с помощью /Бен/ш.
Я нашел ответ от @Остин Филлипс на месте. Одно маленькое усовершенствование, которое я'd сделать это добавить -о (игнорировать значение PID самого скрипта) и матч для сценария с базовым именем (т. е. тот же код можно ставить в любой сценарий):
Используйте команду PS В немного другой способ, чтобы игнорировать процесс ребенка, а также:
Я обнаружил, что, используя обратные кавычки, чтобы захватить вывод команды в переменную, adversly, дает слишком много ПС ОКС результаты, например, на один запущенный экземпляр abc.sh:
возвращает "и 1" и. Однако
возвращает "и 2"и
Похоже, используя Апостроф строительства как-то временно создает другой процесс. Может быть причиной того, что topicstarter не мог сделать эту работу. Просто нужно уменьшить $рассчитывать ВАР.
pidof
это't работа для меня, поэтому я искал дальше и наткнулся наpgrep
Взято из ответов выше и https://askubuntu.com/a/803106/802276
Я создаю временный файл во время выполнения.
Это, как я делаю это:
Я не'т хотим, чтобы жестко `abc.sh в проверить, поэтому я использовал следующие:
Это компактный и универсальный
[ " и$(pidof -х $(базовое имя $0))" у != усилитель$$ ] &;& выход
https://github.com/x-zhao/exit-if-bash-script-already-running/blob/master/script.sh