web-dev-qa-db-ja.com

Linuxでプロセスを強制終了し、強制的に0を返しますか?

Linux環境で、プロセスから返される終了コードが0であることを確認しながら、killシグナルをプロセスに送信するにはどうすればよいですか?私はこれのためにいくつかの派手なGDBマジックを行わなければならないでしょうか、それとも私が知らない派手な殺害信号がありますか?

テストケース:

cat; echo $?

killall cat

さまざまなkillシグナルを試しても、129、137、143などの異なるリターンシグナルしか提供されません。私の目標は、スクリプトが実行するプロセスをkillすることですが、スクリプトは成功したと見なします。

17
sega01

GDBとプロセスIDを使用してプロセスにアタッチし、exit(0)を引数としてcallコマンドを発行できます。

call 実行中のプログラム内で関数を呼び出すことができます。 exit(0) を呼び出すと、戻りコード0で終了します。

gdb -p <process name>
....
.... Gdb output clipped
(gdb) call exit(0)

Program exited normally.

1行ツールとして:

gdb --batch --eval-command 'call exit(0)' --pid <process id>
22
LeStarke

いいえ。シェルがSIGCHLDをキャッチすると、無条件に戻り値をゼロ以外の値に適切に設定するため、スクリプトまたはシェルのいずれかを変更する必要があります。

わかりませんが、リストされた信号のいずれかが受信された場合、これは0で終了します。関数の呼び出しなど、他のアクションを実行できます。

#!/bin/bash 
trap 'exit 0' SIGINT SIGQUIT SIGTERM
3
TBI Infotech

このワンライナーは私のために働きました:

/bin/bash -c '/usr/bin/killall -q process_name; exit 0'
3
Landon Thomas

ちょっとハッキーな方法ですが….

プロセスのラッパーを作成して、SIGCHLDハンドラーをオーバーライドできます。例えば:

#!/bin/bash
set -o monitor
trap 'exit(0)' CHLD
/some/dir/yourcommand

その後、スクリプトをプロセスの代わりにこのラッパーを実行するようにすることができます。これを$ PATHの前の方に置き、名前を同じ名前に変更します。

2
DukeLion