nixp.ru v3.0

18 января 2017,
среда,
04:44:37 MSK

DevOps с компанией «Флант»
Fatal написал 10 ноября 2004 года в 12:12 (491 просмотр) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

Как в Unix определить запущена ли программа или нет? Это нужно, что бы не запускать повторно ту же программу.

Genie

man pidof

Fatal

Я думаю, что pidof для Linux, поту что у меня в манах такого нет. (FreeBSD)

decvar

ps aux | grep ?

Steck

Я сделал так…

Запускаю прогу считываю ее пид и …сохраняю наприме в

/tmp/proga.pid

А при запуске прога мотрит есть ли такой файлик …ну ты меня понял

У меня так организовано

[steck(~)]$ my_clock

my_clock: Arleady running at pid 647 ?

Kill process or remove /home/steck/.my_clock.pid

Если прогу кильнуть то перед этим она удаляет *.pid

Потом можно считывать из файла pid и проверять та это прога или нет

(Вдруг этому файлу пару лет уже ;o) )

а проверять ..

Смотреть в /proc искат там диру с названием нашего пида… и копать там

P.S Потерял свое красноречие но надебсь понятно описал ;o)

ivan

Я так понимаю ты знаешь pid процесса, если да, то скорее всего если он не запущен, то функция которая посылает сигнал вернёт значение ошибки.

сам я сигналами ни когда не пользовался, но помоему системный вызов kill

может посылать любые сигналы, а не только TERM и т. д.

ivan

Блин мысль выразил, а что делать забыл сказать:

пошли ему какой-нибудь сигнал!

Dmitry Ivanov
Fatal
Как в Unix определить запущена ли программа или нет? Это нужно, что бы не запускать повторно ту же программу.

взять из стартап скриптов из RH файлик functions и посмотреть, как это там сделано…

Fatal

Спасибо, и извините, но я имел в виду что-нибудь на Си — это моя вина, я не написал.

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

И желательно с /proc не делать, потому что это делает прогу зависимой от конкретного Unix, а это не желательно.

ivan

С сигналами пробовал?

Fatal

С сигналами не получиться, что бы послать сигнал надо знать pid процесса. Здесь надо, что-то попроще.

Any_Key

а как именно запускается программа?

Fatal

Из командной строки, или другой прогой через fork + exec

ivan

А что ты о нём знаешь?

Any_Key
Fatal
Из командной строки, или другой прогой через fork + exec


тогда батенька есть вариант чтоб ета программа устанавливала системную переменную каккую-нибудь

а для форканья смотри man fork, ибо «fork» возвращает свой PID породившему процессу больше не скажу т.к. «C» незнаю вообще :)

ещё вариант при запуске создать фаил «var/run/имя_программы.pid» а при выключении его удалять в файле хранить собственно PID и проверять на соответствие

Genie

hint: читать про Interprocess Communication (IPC)

как оно делается, зачем оно делается и почему оно делается

проблемы, которые при этом возникают и пути их решения.

самый прсотой метод в данном случае — создание named sharing object. пусть даже это будет файлом.

в общем случае — это именно «именованый объект», который создаётся (и доступ к которому блокируется) процессом, в который он записывает нужную информацию…

Fatal
Genie
hint: читать про Interprocess Communication (IPC)

Да IPC объекты я знаю прекрасно, да вот только если программа было убита сигналом KILL, который нельзя поймать, или получила сбой, то IPC объект некому будет освободить и если запустить программу еще раз, она будет думать, что ее копия уже активна и не запуститься.

Genie

блокировка по удитию процесса со всех файлов снимается

как и происхождит закрытие всех файловых бескрипторов

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.