Убить процесс и заставить его вернуть 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
Другие вопросы по тегам