@waltaki

Как послать сигнал на дочерний sh процесс?

Существует команда sh -c "java -jar ol.jar", PID bash процесса мне известен, а вот его дочернего нет. Я посылаю сигналы на PID sh процесса, и только 9 сигнал срабатывает (логично, он же его убивает), остальные сигналы sh съедает сам и не посылает дочернему процессу.

Как заставить sh пересылать сигналы дочернему процессу? Может аргумент какой есть.
pstree работает, но всё же выглядит как костыль.
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
Vamp
@Vamp
Существует возможность заменить процесс sh процессом java при помощи команды exec:
sh -c "exec java -jar ol.jar"

В этом случае дочерний процесс займёт место родителя. В частности, получит PID bash процесса, который вам уже известен. Разумеется, если в скрипте после вызова java идут какие-то ещё команды, то они никогда не выполнятся, так как процесс bash перестаёт существовать в момент вызова exec.

Если всё же необходимо выполнить какие-нибудь завершающие команды по окончании работы java процесса, то существует возможность повесить собственные обработчики сигналов:
#!/bin/sh

# Устанавливаем обработчик сигналов HUP INT QUIT TERM и псевдосигнала EXIT.
# В обработчике отправляем сигнал TERM процессу, чей pid будет записан в
# переменной CHILDPID.
trap 'kill $CHILDPID' HUP INT QUIT TERM EXIT

# Запускаем java в фоне.
java -jar ol.jar &

# Сохраняем PID только что запущенного дочернего java процесса.
CHILDPID=$!

# Следующая команда ставит процесс sh на паузу.
# Пауза снимется после завершения фонового java процесса.
# Обработчик сигналов при этом остаётся работоспособным и будет
# корректно отрабатывать во время паузы.
wait

# В этом месте java уже завершилась и можно что-нибудь сделать.
# Например, подчистить временные файлы.
echo Cleanup actions
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
sh -c "java -jar ol.jar"
Зачем такая команда, если можно сразу java -jar ol.jar?

Я посылаю сигналы на PID sh процесса, и только 9 сигнал срабатывает (логично, он же его убивает), остальные сигналы sh съедает сам и не посылает дочернему процессу.

sh ничего не съедает и передавать автоматом в дочерние процессы он может только sighup, который он не передаст поскольку у вас интерактивная сессия, и сигнал 9 до процесса не доходит - процесс прибивается ядром.

Собственно пока не будет понятно, зачем вы запускаете sh из которого запускаете jar, не очень понятно что происходит.

Возможно, вам нужно это делать вот так:
java -jar  ol.jar &
echo $! > ol.pid

и следовательно получать pid джава процесса в файле, в дальнейшем с ним работать.
Ответ написан
Комментировать
leahch
@leahch Куратор тега Linux
3D специалист. Dолго, Dорого, Dерьмово.
А написать спою запускалку, которая будет pid из переменной $! доставать? https://unix.stackexchange.com/questions/30370/how...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы