/tmp/bash.sh
以下を含むスクリプトがあります。
killall name*
/tmp
フォルダに行って実行すると正常に動作しますが、それ以外の場合は動作./bash.sh
し/
ません。むしろ文句を言う/tmp/bash.sh
./tmp/bash.sh
name*: no process found
なぜ?この問題をどのように解決しますか?
答え1
このkillall
ユーティリティはパターンを使用せず、シグナルを送信する1つ以上のプロセス名のリストが必要です。
killall name*
シェルが引用符で囲まれていないファイル名のワイルドカードパターンを、パターンと一致する現在のディレクトリのすべてのファイル名に拡張すると言うとname*
どうなりますか?
/tmp
このパターンに一致し、終了したいプロセスに対応するファイル名があるようです。
一致するファイル名がない場合、/
システムのディレクトリに一致するファイル名がないように見えるように、シェルはパターンを拡張しません。ユーティリティkillall
は呼び出されたプロセスを見つけることができず、name*
あなたが質問に報告した方法でこれについて不平を言います。
期待どおりに機能するユーティリティを見つけるには、このpkill
ユーティリティを検討してください。それであなたはできます拡張正規表現名前を合わせてみてください。
次のコードは、TERM
名前が次の文字で始まるすべてのプロセスにシグナルを送信しますname
(このパターンは通常引用符で囲む必要があります)。
pkill '^name'
名前がname
正確に一致するプロセスにシグナルを送信します。
pkill '^name$'
またはより良い、
pkill -x name
プロセスに提供された引数も考慮するには、たとえば、とともに-f
オプションを使用し、次のように入力して開始したコマンドを終了します。pkill
cat
cat myfile
pkill -f -x 'cat myfile'
pkill
マニュアル()も参照してくださいman pkill
。