プロセスを開始および終了するシェルスクリプトがあります。プロセス名をパラメータとして受け入れます。彼らを見つけて殺さなければなりませんpid
。
最初はこれでした。
for procname in ${@};do
pkill -f $procname
done
理由はわかりませんが、渡されたすべてのプロセスが終了するわけではありません。今私はこのようなものを探しています。
for procname in ${@};do
IFS=$"\n"; echo
(ps auxw | awk -v proc="$procname" -v preserve="${0##*/}" \
'$0 ~ proc && $0 !~ preserve && ! /awk/ { print $2}')
done
上記のコードでpidを印刷しようとしていますが、kill
コマンドが必要で、forループなしで動作しても問題ありません。
プロセス名には
.
次の内容が含まれます。com.abc.def.pqr.xyz
ベストアンサー1
pkill -f -- "$regex"
ps -f
空白(標準またはBSDで報告されたものと同じ)に関連付けられた引数のリスト(コマンドを実行するプロセスまたはコマンドを実行した祖先があるプロセスの場合)が、指定された拡張正規表現にps u
一致するプロセスを終了します(常に自分自身を除外する)。
したがって、ここで必要なのは、位置パラメータを次のものと組み合わせることです|
。
IFS='|'
pkill -f -- "$*"
引数リストの代わりにプロセス名を一致させるには、を削除します-f
。ただし、Linuxではプロセス名の長さが15バイトに制限されているため、これは不可能ですcom.abc.def.pqr.xyz
。また、これは.
単一文字演算子と一致する正規表現であることに注意してください。その文字を含むプロセスパラメータのリスト(たとえばcomXabcYdefZpqr+xyz
)を一致させるには正規表現が必要ですcom\.abc\.def\.pqr\.xyz
。