次のようなシェルスクリプトが必要です:
my-app & echo $my-app-pid
しかし、実行したばかりのコマンドのpidを取得する方法がわかりません。
jobs -p my-app
コマンドを使用してpidをgrepできることはわかっています。しかし、シェルを複数回実行したい場合、このメソッドは機能しません。 jobspec があいまいだからです。
回答
回答
PID
を取得:
#!/bin/bash my-app & echo $!
PID
を変数に保存します:
#!/bin/bash my-app & export APP_PID=$!
すべてのインスタンスを保存します:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
出力、エラー、およびPID
を別々のファイルに保存します:
#!/bin/bash my-app >/tmp/my-app.log 2>/tmp/my-app.error.log & echo $! >>/tmp/my-app.pid echo "my-app PID"s: $(cat /tmp/my-app.pid)"
コメント
- 質問はありませんでした'リダイレクトについて尋ねると、
my-app
のインスタンスが終了し、さらに悪いことにそのPIDが後で再利用されることを除いて、あなたの答えは受け入れられたものとほとんど同じです。'ファイルに不正な情報が含まれています。 'この回答が既存の受け入れられた回答に実際に多くの価値を追加するとは思わない - @EricRenoufの投稿が更新されました!
- 別の派生物役に立つかもしれません。これはPIDを取得し、同時にそれを(ほとんど)フォアグラウンドプロセスとして扱います:
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
` - isnt APP =
main &
PIDを取得する方法は?
回答
次のような方法を試してください
pidof my_app >> /tmp/my_app.pid
コメント
- 外部コマンド、システムがPIDを直接提供できる場合は、すべてのプロセスを検索してそれだけを見つける理由?また、'確実に'正しい値が得られるかどうか
回答
次のようにしてみてください:
ps ef | grep "[m]y-app" | awk "{print $2}"
プロセスの最初の文字を<の間に配置しますdiv id = "95f74068f1">
]
は、リストにgrep
プロセスが含まれていないことを確認します。必要に応じて、ユーザー名にgrepを追加することもできます。
コメント
- その'せいぜい壊れやすく、
my-app
が複数回実行された場合は'機能しません- davidshen84 は特にそれについて心配していますcas。 - このルートを使用する場合でも、代わりに
pgrep
を使用する必要があります。
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 11月24日' 10 at 14:28echo $!
の出力とは関係ありません。
my-app & myVar=$! ; fg
。fg
は、プロセスを再びフォアグラウンドにします。その後、後でecho $myVar
を印刷でき、' my-appがすでに終了していることを確信しています。