Linuxでプロセスを強制終了して0を返すようにしますか?


16

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

テストケース:

cat; echo $?

killall cat

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

回答:


20

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

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>

プログラムが(g)libcを使用しない場合、これは機能しませんNo symbol table is loaded. Use the "file" command。たとえば、アセンブリで書かれたプログラムです。これは非常にまれですが。
クリスティアンシウピトゥ14

ルビースクリプトの作成:-D
ミハイル

1
@CristianCiupituその問題を回避する方法があります。次のシステムコールへのエントリで、関連するレジスタを変更して、ターゲットプログラムが引数として_exitシステムコールを呼び出すように0します。これは、単にCPUサイクルをループさせて燃焼させるだけではないプロセスで機能します。プロセスが無限ループでスタックしない場合でも、実行可能ファイルのどこかで必要な命令を見つけて、そこに命令ポインタを向けることができれば、同じアプローチを使用できます。
カスペルド

@Mikhailは、GDBがバイナリがglibcにリンクされているルビーインタープリタープロセスに接続されていたため、「ルビースクリプト」に取り組みました。
ダニエル

@kasperd、ええ、私はそうですが、より正確な指示がいいでしょう。
クリスチャンシウピトゥ


3

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

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

3

このワンライナーは私のために働いた:

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

あなたが質問を理解したとは思わない。そのコマンドは、求められていたものを達成する方法はありません。これは、コマンドを使用して得たものです$ cat; echo $? Terminated 143
カスペルド

2
@Landon Thomasここに示すコード行は実際には0を返します。しかし、killされたprocess_nameは0を返しません。これはOPが望んだものです。
ダニエル

2

少しハックな方法ですが、..

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.