通常、私はps
Linuxでこのコマンドを使用してプロセスのpidを見つけ、そのpidを使ってプロセスを終了し、その特定のプロセスの特定のコマンドを使用してプロセスを再実行します。
私の質問は - 単一のコマンドでプロセスをどのように終了して再実行できますか?
可能ですか?
答え1
PIDを取得し、ファイルの/prc/$pid/cmdline
読み取りから開始するために使用されたコマンドを確認できます。
pid=123
com=$(perl -pe 's/\0/ /g' /proc/$pid/cmdline)
kill 123 && "$com"
したがって、これを関数に置き換えることができます。
restartPid(){
pid=$1
com=$(perl -pe 's/\0/ /g' /proc/"$pid"/cmdline)
kill 123 && "$com"
}
ただし、これは特定の環境でコマンドを実行するより複雑な場合には機能しません。より多くの作成を開始し、次の環境を含めるように拡張できます。
restartPid(){
pid=$1
tempFile=$(mktemp)
perl -pe 's/\0/\n/g' /proc/"$pid"/environ |
perl -pe 's/^([^=]+)=(.*)/$1="$2"/' > "$tempFile"
read -r com args < <(perl -lne '@k=split(/\0/); print "$k[0] ", join " ", map "\"$_\"", @k[1..$#k]' /proc/"$pid"/cmdline)
dir=$(readlink -f "/proc/$pid/cwd")
kill $pid
( . \"$tempFile\"; cd "$dir"; eval $com $args )
}
しかし、見てわかるように、これは非常に複雑になり、常に機能することを保証することはできません。しかし、良いスタートでなければなりません。