0

Cygwin でシェル スクリプトを実行しようとしていますが、変数をサブシェルに渡すのに問題があります !!

実際にプロセスの PID を取得する非常に単純なスクリプトがあり、そこからスクリプト内からプロセスを強制終了したいと考えています。

# my_proc_kill.sh
#
export c=$(ps -W | grep -ir behave | sed 's/\([0-9]\+\).*/\1/')
echo $c
#1
/bin/kill -f $c     
#2                  
sh -c '/bin/kill -f ${c}' "$c" 
#3       
sh -c '/bin/kill -f $@' _ "$c"        
#4
e=$(taskkill /PID $c)

私はプロセスを4つの異なる方法で強制終了しようとしましたが、どれもうまくいきませんでした!

(#1) と (#4) は、Cygwin ターミナル内で直接呼び出すと問題なく動作するのに、「my_proc_kill.sh」を実行するとうまく動作しない理由がわかりません。

私が気付いたもう1つのことは、(#4)の場合、「$c」を実際のプロセス番号に置き換えてから「my_proc_kill.sh」を実行すると、それが機能することです。つまり、変数値「$c」が「taskkill」に渡されていないようです!! taskkill が変数 "$c" を認識できるように、コードを変更するにはどうすればよいですか?!?

しかし、そのプロセスIDにアクセスしているシェルに関係なく、プロセスを強制終了していない限り、特定のプロセスのPIDを修正すべきではありませんか?

これを回避する方法を教えてください。

スクリプトを実行すると、次のエラー メッセージが表示されます。

5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid: 5040
kill: illegal pid:
ERROR: Invalid query

「kill」がこれを違法なpidと見なすのはなぜですか? しかし、Cygwin ターミナルで同じ PID 番号 (この場合は 5040) を使用すると、機能しますか? (以下は大丈夫です)

$/bin/kill -f 5040

これを解決する方法はありますか?

前もって感謝します。

4

1 に答える 1

0

出力は、同じ PID を 5 回強制終了しようとしていることを示しているようです。

red-hat の cygwin (CYGWIN_NT-6.1-WOW64) を使用して、スクリプトの修正版を実行しました。

#!/bin/bash

export c=$(ps -W | grep -ir notepad | sed 's/\([0-9]\+\).*/\1/')
echo $c

/bin/kill -f $c

変な振る舞いはしませんでした。kill の呼び出しが成功すると、PID が出力されます (最初の行に表示されます)。

最後の行を 4 回繰り返すと、エラー メッセージが表示されます。

それ以外に、最後の PID が子プロセスであり、親プロセスが終了したときにツリーキルのように終了する可能性があります。

別の提案として、PID を指定する代わりに、/IMAGE オプションに加えて /F 引数を指定して taskkill を実行し、「汚い」方法を使用して、exe 名を一致させました。提供されている例:

taskkill /?
于 2013-06-18T22:53:55.797 に答える