Как в среде Linux отправить сигнал об уничтожении процессу, убедившись, что код выхода, возвращаемый этим процессом, равен 0? Придется ли мне для этого применить какую-нибудь причудливую магию GDB, или есть необычный сигнал уничтожения, о котором я не знаю?
Прецедент:
cat; echo $?
killall cat
Испытание различных сигналов уничтожения предлагает только разные сигналы возврата, такие как 129, 137 и 143. Моя цель - убить процесс, запускаемый сценарием, но заставить сценарий думать, что он был успешным.
Вы можете присоединиться к процессу, используя 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
он безоговорочно устанавливает для возвращаемого значения соответствующее ненулевое значение, так что это потребует модификации либо сценария, либо оболочки.
Я не уверен, но это приведет к выходу с 0, если будет получен какой-либо из перечисленных сигналов. Вы можете выполнять другие действия, включая вызов функции и т. Д.
#!/bin/bash
trap 'exit 0' SIGINT SIGQUIT SIGTERM
Этот однострочный сработал для меня:
/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 и переименовав на то же имя.