私のスクリプトはプロセス名を入力として受け入れて終了します。 pgrepを使ってみましたが、2つのPIDが返されました。 1つは実行中のプロセス用で、もう1つはプロセス名を入力として受け入れるスクリプト用なので、詰まっています!私もそのオプションを試しましたが、pgrep
-fo
それも役に立ちませんでした。どんなアドバイスでも役に立ちます。これは私のスクリプトです。
#!/bin/bash
ProcessName=$1
pID= pgrep -fl $ProcessName
echo $pID
したがって、スクリプトを呼び出すと2つのPIDが返されます。
bash-3.00$ ./dynamic_values.sh test-Process
10534 /xxx/xxo/xxx/xxe --run --propFile /application/test/test-Process_Archive.tra --innerProcess
23401 /bin/bash ./dynamic_values.sh test-Process
私は10534を期待していましたが、スクリプトもインポートします。 OSバージョンの場合:
bash-3.00$ uname -a
Linux xxxxxx 2.6.9-67.0.1.
答え1
数週間前でも同じ問題を解決する必要がありました。pgrep
また、pkill
拡張正規表現をサポートしているので、正しい正規表現を取得するのは簡単です。
以下は私が使用したスクリプトと正規表現です。
#!/bin/bash
ProcessName=$1
pID= pgrep -fl "^(/.*)?${ProcessName}\s"
echo $pID
(Calebが提案したように)使用する方が良いですpkill
。
pkill -fl "^(/.*)?${ProcessName}\s"
ユースケースとプログラムのパフォーマンスに必要な結果を得るには、正規表現を調整する必要があります。
もしあればはい実際、その名前で実行されているいくつかのプロセスはもちろん終了します。これを避けたい場合は、-o
ただキルを使用してください。最も古いプロセスを一致させるか、-n
単に終了します。最新情報。 1つだけが必要ですが、最も古いものでも最新でもない場合は、使用しないでくださいp(kill|grep)
。
答え2
使用しない
| grep -v $$
リストからプロセスを除外すると役に立ちますか?
答え3
#!/bin/bash
ProcessName=$1
pID=`pgrep -fl $ProcessName`
echo "$pID" | grep -v "^$$"
答え4
#!/bin/bash を除くと、そのスクリプト用の他のプロセスは作成されませんが、実行するシェルを選択することはできません。 bashは、笑顔の人が実行できるほどのデフォルト設定です。
しかし、これが2番目のプロセスIDを削除するかどうかはわかりません。
これは完全ではないことを知っていますが、時間が遅く、朝に働かなければなりませんが、この「すべき」迅速な修正が可能です。