`ps|query|Kill`​​私のスクリプトは早く中断されます。

`ps|query|Kill`​​私のスクリプトは早く中断されます。

SSH経由でリモートで使用できるLinuxコンピュータがあります。フリンクマシンにWindows XP。自動ログインを使用してスクリプトからコマンドを実行するようにPlinkプログラムを設定しました。

plink -ssh [domain name] -l [username] -pw [password] -m commands.txt >> Outputtext.txt

commands.txt以下の内容のみが含まれます。

echo "Killing process"
ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1` | xargs kill -9
sleep 2
echo "Restarting process"
processd &

echo "Exiting..."

スクリプトはプロセス名を検索して終了し、再起動します。スクリプトを実行する前に、Linuxでプロセスが実際に起動すると、毎回動作します。ただし、プロセスが開始されない場合は、実際には制御端末を終了し、コマンドplink.exeに従って終了します。ps -ef

範囲を絞り込み、これを行うとps -ef | grep 'processname'2つのPIDが返されます。 1つは私が検索しているプロセスで、もう1つはgrep processname PID自体です。

プロセスが起動しない場合は、プロセスを終了し、何らかの方法でplink接続を終了するか、端末を制御すると仮定するgrep 'processname'PIDを返しますか?kill -9この問題を解決する方法はありますか?

2行を返すと、プロセスが開始されたことを意味するかどうかを確認するかgrep 'processname'、1行だけで終了しないでください。

echo "#!bash"bashスクリプトを出力してからbashスクリプトを実行できるかどうかわかりませんか?

それともplinkの奇妙なバグですか?

答え1

あなたのコマンドラインが私の目には本当に奇妙に見えます。

ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1 | xargs kill -9
  1. awk出力をプログラムに入力します(入力を完全にフィルタリングできるプログラム、より強力なプログラムなど)grep
  2. awk出力(つまり、出力を完全にフィルタリングできるプログラム)をhead
  3. 確かにxargs1つのパラメータのみを使用してください。

したがって、より良いアプローチ(この質問は重複しています)に関係なく、以下を修正する必要があると思います。

kill -9 $(ps -ef | awk '/processname/ {print $2;exit;}')

答え2

ps興味のある情報のみを出力するように検索コマンドを制限します。

ps -C processname -o pid

しかし、実際に何かを殺す前に、コマンドの結果コードを確認することをお勧めします。

関連情報