Я выполняю сценарий оболочки в фоновом режиме из моего сценария 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 сна переопределены, и я не в состоянии убить его, когда приходит ловушка ,
Ожидание сна, но я пишу pid сна в файл и обработчик сигнала. Я читаю этот pid и убиваю его, а затем вызываю свою функцию. Странная часть - это прекрасно работает, когда фоновый скрипт не является сиротой. – egorulz
@egorulz Tcl действительно не мешает обработке сигналов подпроцессов; что пишет michas. Я думаю, нам нужно больше деталей сценария проблемы для решения этой тайны (например, вы могли бы каким-то образом заставить сценарий делать ожидания в подпроцессе или установить обработчик сигнала в неправильном процессе). –
Это похоже на проблему в вашем коде. Попытайтесь свести к минимуму свой код, оставьте все, что не является абсолютно необходимым для воспроизведения вашей проблемы. Либо вы затем обнаружите проблему самостоятельно, либо получите небольшой фрагмент кода, который вы должны добавить к своему вопросу. – michas