Убить процесс и заставить его вернуть 0 в Linux?
В среде Linux, как я могу отправить сигнал уничтожения процессу, убедившись, что код выхода, возвращаемый этим процессом, равен 0? Должен ли я сделать для этого какую-нибудь причудливую магию GDB, или есть какой-нибудь причудливый сигнал убийства, о котором я не знаю?
Прецедент:
cat; echo $?
killall cat
Попытка различных сигналов уничтожения дает только разные обратные сигналы, такие как 129, 137 и 143. Моя цель - убить процесс, который запускается сценарием, но заставить сценарий думать, что он был успешным.
6 ответов
Вы можете присоединиться к процессу, используя GDB и идентификатор процесса, а затем выдать call
команда с exit(0)
в качестве аргумента.
call
позволяет вызывать функции внутри запущенной программы. призвание exit(0)
выход с кодом возврата 0.
gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)
Program exited normally.
Как однострочный инструмент:
gdb --batch --eval-command 'call exit(0)' --pid <process id>
Нет, когда оболочка ловит SIGCHLD
он безоговорочно устанавливает возвращаемое значение в ненулевое значение, так что для этого потребуется модификация скрипта или оболочки.
Этот однострочник работал для меня:
/bin/bash -c '/usr/bin/killall -q process_name; exit 0'
Немного хакерский путь, но..
Вы можете создать оболочку для вашего процесса, переопределяя SIGCHLD Handler. Например:
#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand
После этого вы можете заставить ваш скрипт запускать эту оболочку вместо вашего процесса, поместив его ранее в $PATH и переименовав в то же имя.
Я не уверен, но это завершится с 0, если какой-либо из перечисленных сигналов будет получен. Вы можете выполнять другие действия, включая вызов функции и т. Д.
#!/bin/bash
trap 'exit 0' SIGINT SIGQUIT SIGTERM
Чтобы убедиться, что илиkillall
команда не нарушает оболочку (как в сценарии bash сset -e
), или убедитесь, что строка сkill
выходит с 0. Мы можем попробовать
killall <PROCESS_NAME> || /bin/true
или
kill <PROCESS_NAME> || /bin/true