Назад | Перейти на главную страницу

Убить процесс и заставить его вернуть 0 в Linux?

Как в среде 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 и переименовав на то же имя.