LINUX.ORG.RU
ФорумAdmin

Убить дочерний процесс bash

 ,


0

2

Запускается app -> bash -> ffmpeg

app убивает (SIGKILL) bash, а ffmpeg живет спокойненько
Через trap в баше SIGKILL не ловится. Как быть?

Код примерно такой

cleanup() {
   kill -9 "$FFMPEG_PID"
}


trap cleanup EXIT SIGINT SIGTERM SIGHUP TERM INT

fmpeg &
FFMPEG_PID=$!
wait


В самом ffmpeg можно конечно тайм-аут сделать, но как то это не кошерно... Охота сразу его пришибать

★★★★

Последнее исправление: gobot (всего исправлений: 3)
Ответ на: комментарий от gobot

Ну приходится подчиняться операционной системе. Нельзя — значит нельзя. Насколько мне известно, никто не застрахован от sigkill.

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

Edit: Хотя… Возможно, KillMode=control-group поможет.

kaldeon
()
Последнее исправление: kaldeon (всего исправлений: 4)

Можно посылать сигнал группе (отрицательное значение pid)

Не обязательно убивать по -9. Можно посылать какой-нибудь сигнал типа SIGQUIT/SIGABRT/SIGILL/SIGBUS.

Может это поможет если ты ffmpeg в фоне запускаешь?

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 1)

Если исправить дурацкое поведение app нельзя, а запускать фыфыфмпег через exec не хочется из-за логики выполняемой после, то можно запускать в фоне второй процесс bash, который ждёт смерти родителя и убивает ффмпег.

fmpeg &
FFMPEG_PID=$!

sh -c 'tail -f --pid=$1 /dev/null; kill $2;' - $$ $FFMPEG_PID &


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

Перед — понятно. Я спросил то, что спросил: зачем делать ffmpeg & и wait (то есть, оставлять bash висеть, во время работы ffmpeg), если можно в целом избавиться от процесса баша, когда он уже не нужен, сделав exec ffmpeg

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

оставлять bash висеть, во время работы

Если bash закончит работу, он будет перезапущен заново (приложением которое запускает все это), а ffmpeg будет висеть и так бесконечно...

gobot ★★★★
() автор топика
Ответ на: комментарий от papin-aziat

Ну… Это разные механизмы. Но если вот так со стороны смотреть, то в случае с exec, поскольку текущий процесс заменится вызываемым, его PID останется тем же, а в случае с & новый процесс будет с новым PID, и только потом процесс скрипта завершится. Ну и при & процесс в фоне работать будет, а при exec — в fg.

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

Наоборот. Обычный запуск программы в юникс - это fork+exec, т.е. родительский процесс форкается, порождая свою точную копию (за исключением кода возврата fork()), после этого родитель-потомок выполняет exec(). exec() заменяет исполняемый код и очищает память вызвавшего процесса, подставляя код из бинарника программы-цели. При exec сохраняются PID, открытые файлы и переменные окружения. Вместе с PID сохраняются и отношения потомок-родитель.

Команда exec в шелле делает exec() без fork(). Шелл жертвует собой, но передаёт свой PID запущенной программе.

legolegs ★★★★★
()