LINUX.ORG.RU

pidof -x и шелл-скрипт


0

1
~% cat test.sh
#!/bin/bash
while true; do sleep 16; done
~% ./test.sh&
[1] 666
~% pidof -x test.sh
666

Пока всё хорошо. В фоне выполняется скрипт (вообще-то должен выполняться через setsid, но в контексте вопроса это не важно), а вызывая pidof -x можно посмотреть pid экземпляра шелла, его выполняющего.

~% cat test.sh
while true; do sleep 16; done
~% /bin/bash ./test.sh&
[1] 777
~% pidof -x test.sh

~% echo $?
1

А вот тут всё плохо. Если мы явно вызываем bash, передавая ему имя скрипта как аргумент, pidof его (скрипт) не видит.

Соответственно, вопрос: почему и отчего издохли попуг^W^Wтак происходит и как заставить pidof видеть скрипт, вызываемый вторым способом?

★★★

Во втором случае вы явно указываете запускаемую программу и её параметры, поэтому pidof не считает это скриптом.

tiandrey ★★★★★ ()
Ответ на: комментарий от tiandrey

> Во втором случае вы явно указываете запускаемую программу и её параметры, поэтому pidof не считает это скриптом.

Великолепно, капитан! Но до этого я сам догадался... хм... интуитивно) В таблице процессов (ps) оба способа выглядят совершенно одинаково. Что мешает pidof'у видеть несчастный скрипт?

nbw ★★★ ()
$ pidof bash
3135 2606 2598
$ /bin/bash ./test.sh &
[1] 16624
$ pidof bash
16624 3135 2606 2598
$

Подробности - в предыдущем комменте tiandrey сказал.

OldFatMan ()
Ответ на: комментарий от tiandrey

Я хотел бы использовать штатную функцию killproc (sysV-init) для того, чтобы останавливать фоновый скрипт. Так что ps -e и pidof bash, несмотря на кажущуюся очевидность, неприменимы. Можно, конечно, нагородить костылей, но хотелось бы обойтись без этого %)

nbw ★★★ ()

как заставить pidof видеть скрипт, вызываемый вторым способом?

Зачем?

baverman ★★★ ()
Ответ на: комментарий от OldFatMan

> А почему бы тогда не воспользоваться первым способом запуска?

Не хотелось лишний раз ставить +x на файл в /tmp. Но теперь да, придётся или класть его куда-нибудь в /usr/local/bin, или делать chmod a+x на месте.

nbw ★★★ ()
Ответ на: чего вы задумали я конечно не понял от zolden

Re: чего вы задумали я конечно не понял

Использую автогенерируемый watchdog-скрипт для слежения за состоянием демона pppd (жив/отвалился) и перезапуска в случае необходимости)) pidof используется в штатной функции killproc, которой я и хочу воспользоваться для корректного завершения скрипта. В общем, захотелось всё сделать красиво, с минимумом лишних деталей, чтобы всё запускалось из одного файла в /etc/init.d/.

nbw ★★★ ()

как уже сказали - pgrep. ну или pkill -0 pppd - если тебе надо проверять живость конкретного процесса.

и не используй while true; в подобных скриптах. pid-ы будут кушаться со страшной силой. лучше просто while ; do ... ; done

ananas ★★★★★ ()
Ответ на: комментарий от ananas

Обошёлся pgrep'ом, забив на killproc) За while true не знал, thnx. Рисуем костыли и ждём systemd, в общем.

Спасибо всем отписавшимся.

nbw ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.