2017-01-06 3 views
1

У меня есть задание cron, которое запускает скрипт оболочки каждые 8 ​​часов, что в свою очередь вызывает кучу программ. Иногда эти программы не заканчиваются изящно, и они застревают в подвешенном состоянии.Найти pid каждого процесса, вызванного в сценарии оболочки

Так что, если мой cron'd скрипт (run_foo_bar.sh) выглядит следующим образом:

python foo.py 
python bar.py 

... Я мог бы иметь несколько Foo-х и бар, работающие одновременно. Прямо сейчас я получаю участие PID, делая ps -ax |grep foo, а затем нахожу runtime, используя ps -p $PID -o etime=, но это становится громоздким.

В программах python на консоль печатаются кучи операторов отладки, и сам сценарий оболочки передается по протоколу в файлы журнала. Я хотел бы найти способ, который бы вторит PID каждого процесса, как только он вызывается вместе с временем вызова, так что мой run_foo_bar.sh будет выглядеть следующим образом:

date 
python foo.py 
<some magic to find PID> 
echo foo.py is running as PID $PID 

date 
python bar.py 
<some magic to find PID> 
echo bar.py is running as PID $PID 
+0

Вы не можете добавить что-то в код python, чтобы он мог сам сообщить свой PID и поместить его на std-out? Удачи. – shellter

+0

Возможно [это] (https://stackoverflow.com/a/13202292/2877364)? – cxw

+1

В настоящее время 'python foo.py' будет работать до выхода' foo.py', после чего не будет найден PID. Не могли бы вы пояснить? Ли 'foo.py' переводит себя на задний план или что-то в этом роде? Откуда вы знаете, когда процесс «застрял в подвешенном состоянии»? – cxw

ответ

1

Таким образом, для полноты картины, на стороне Python, вы может:

import os, sys 
print(os.getpid()) 
sys.stdout.flush() 

, чтобы сбросить текущий PID. Вы можете распечатать его в файл вместо терминала, чтобы вы могли его перенести из этого файла.

В оболочке, так как вы просто ждет хрон для запуска, другой вариант это (модифицированный из this answer):

python foo.py & echo "$!" > "some file somewhere that will hold the PID" ; fg 

Это работает python foo.py в фоновом режиме, сохраняет идентификатор процесса в python процесс (который находится в $! за this), а затем возвращает python на передний план, чтобы он мог нормально работать.