異なるパスで同じファイル名を持つ3つのアプリケーションを実行しています。
$ ~/app1/main
$ ~/app2/main
$ ~/app3/main
実行可能ファイルのフルネームを受け入れてアプリケーションを終了するbashスクリプトを作成したいと思います。
$ ./my_killer.sh /home/me/app2/main
どうすればいいですか?具体的には、フルネームでアプリを終了する方法は?
ベストアンサー1
Linuxのサポートのみが必要な場合(あなたの質問がlinuxでタグ付けされているようです)、シンボリックリンクを使用できます/proc/%d/exe
。
これはこれを行うスクリプトの例です。
#!/bin/bash
if [ "$#" != 1 ] || [ "$1" = "" ]
then
echo "Usage: $0 <full-exe-path>" 1>&2
exit 1
fi
shopt -s extglob
cd /proc
for PID in [1-9]*([0-9])
do
if [ "$(readlink "$PID"/exe)" = "$1" ]
then
kill "$PID"
fi
done
1つの注意点は、プロセスIDがカーネルスレッドであるか、あなたに属していない場合にreadlink
失敗し、空の"$(readlink "$PID"/exe)"
文字列として評価されることです。これらすべてのプロセスを終了しようとすることを避けるために、$1
スクリプトは空の文字列の場合は何も拒否します。
また、このスクリプトはextglob
ディレクトリの一致を許可する形式を使用することに注意してください。[1-9]*([0-9])
つまり、間隔の1文字1-9
の後には、間隔の文字数に制限はありません0-9
。