fat0troll 24.04.2012 18:30

Tips & tricksПростой запрет запуска нескольких копий процесса

Опционально — с графическим оповещением.



Суть — простейшая строка:

1
ps aux | grep process | grep -v grep || /usr/bin/process



Да, я в курсе про pgrep, но он работает не всегда и не везде.

Если вы хотите запихнуь такую проверку в скрипт (лежащий, например, в /usr/local/bin), делайте так:

1
ps aux | grep process | grep -v grep | grep -v /usr/local/bin/process.sh || /usr/bin/process



иначе оно всегда будет думать, что процесс запущен.

Для графического оповещения можно использовать zenity:

1
ps aux | grep process | grep -v grep | grep -v /usr/local/bin/process.sh && zenity --error --text "Процесс уже запущен." || /usr/bin/process




Юзайте.

Придумано за 10 минут в попытках борьбы с такой проблемой: есть скайп, в котором включена автоавторизация, и есть невнимательный юзер, могущий запустить его кучу раз. Фигня в том, что автоавторизация слетает, когда появляется второй процесс скайпа. Данный скрипт залатал данную проблему.


Тэги:
+ 1 -
Похожие Поделиться

fkvfaydar 24.04.2012 18:38 #
у grep есть такая штука как ps aux | grep [p]rocess
Тогда не понадобится дополнительно грепать grep -v grep
dukeglukem 24.04.2012 21:25 #
#!/bin/sh
if ! [ "$(pidof $@)" ] ; then $@ ; fi
kstep 25.04.2012 18:31 #
Может тогда

pidof $1 >/dev/null || $@

или

if ! pidof $1 >/dev/null; then $@; fi

?
kstep 25.04.2012 18:32 #
Я это к тому, что не надо тут спавнить ещё один шел через $().
Daria 25.04.2012 00:44 #
и где же pgrep не работает?
kstep 25.04.2012 18:28 #
Может просто не стоять. Сталкивался на нескольких шаред-хостингах. А поставить правов нету.
Daria 26.04.2012 14:29 #
можно же в $HOME/bin
kstep 26.04.2012 17:25 #
Можно. Но бывает:

* Особо параноидальные админы, у которых home в noexec,
* Необходимость написать скрипт знакомому, и совсем неохота ему объяснять, что надо доставлят pgrep,
* Сделать скрипт, который будет работать на большом парке серверов, и не факт что на всех них будет pgrep.

Так что это как раз тот случай, когда стоит знать несколько подходов.
cblp 25.04.2012 00:54 #
Не будет работать, если захочешь запустить по процессу в каждом экземпляре LXC.

В общем, не изобретай велосипед, а бери проверенный upstart или start-stop-daemon.
Self-Perfection 25.04.2012 08:07 #
flock -n /tmp/MyScript.lock -c MyScript.sh || kdialog --error 'Already running'