2014-02-01 6 views
0

Я выполняю сценарий оболочки в фоновом режиме из моего сценария tcl. Скрипт tcl завершает выполнение через некоторое время. На этом этапе я предполагаю, что сценарий фоновой оболочки становится сиротой и принимается init.Как сигнал осиротевшего фонового процесса?

set res [catch { exec sudo $script &}] 

Теперь проблема в том, что я не могу сигнализировать о моем (осиротевшем) фоновом скрипте. Но почему? Хорошо, теперь он принадлежит init, но почему я не могу его сигнализировать. Только SIGKILL, кажется, работает, и что убивает его - мне нужно, чтобы вызвать обработчик сигнала, которую я написал для обработки SIGUSR2

trap 'process' SIGUSR2 

Почему я не могу сигнализировать свой фоновый процесс сироты? Разве это невозможно сделать? Или есть какое-то обходное решение?

EDIT: Кажется, что он отлично работает, когда сон не задействован. Смотрите пример кода ниже:

trap 'kill `cat /var/run/sleep.pid`; foo' SIGUSR2; 

foo(){ echo test; } 

while true; do 
    echo -n . 
    sleep 100 & 
    echo ${!} > /var/run/sleep.pid 
    wait ${!} 
done 

работает хорошо, когда не сиротой - но в случае бесхозных процесса я думаю, что проблема является истинным PID сна переопределены, и я не в состоянии убить его, когда приходит ловушка ,

ответ

2

позволяет запустить небольшой скрипт так:

bash -c '(trap foo SIGUSR2;foo(){ echo test; };while true; do echo -n .;sleep 1;done) & echo $!'; read 

Это будет раскошелиться на фоновый процесс, который просто работает и выводит некоторые точки. Он также выдает PID процесса, который вы можете использовать для проверки и сигнализации.

$ ps -f 19489 
UID  PID PPID C STIME TTY  STAT TIME CMD 
michas 19489  1 0 23:45 pts/8 S  0:00 bash -c (trap foo SIGUS... 

Поскольку разветвление оболочка умерла сразу после запуска команды в фоновом режиме, процесс в настоящее время принадлежит INIT (PPID = 1).

Теперь вы можете сигнализировать процесс для вызова обработчика:

kill -USR2 19489 

Если вы это сделаете, вы заметите «тест» вывод на терминал печати точек.

Не должно быть разницы, начинаете ли вы фоновый процесс из оболочки или tcl. Если он работает, вы можете отправить ему сигнал, и если есть обработчик, он будет вызван.

Если он действительно не отвечает на сигналы, он может быть заблокирован, ожидая чего-то. Например, в sleep или в ожидании некоторого ввода-вывода.

+0

Ожидание сна, но я пишу pid сна в файл и обработчик сигнала. Я читаю этот pid и убиваю его, а затем вызываю свою функцию. Странная часть - это прекрасно работает, когда фоновый скрипт не является сиротой. – egorulz

+0

@egorulz Tcl действительно не мешает обработке сигналов подпроцессов; что пишет michas. Я думаю, нам нужно больше деталей сценария проблемы для решения этой тайны (например, вы могли бы каким-то образом заставить сценарий делать ожидания в подпроцессе или установить обработчик сигнала в неправильном процессе). –

+0

Это похоже на проблему в вашем коде. Попытайтесь свести к минимуму свой код, оставьте все, что не является абсолютно необходимым для воспроизведения вашей проблемы. Либо вы затем обнаружите проблему самостоятельно, либо получите небольшой фрагмент кода, который вы должны добавить к своему вопросу. – michas

Смежные вопросы