(以前のタイトル-bash:コマンドをバックグラウンドで実行し、pidをキャプチャします)
注これは他の質問の[DUPLICATE]ではありません。これは、「コマンドが見つからない」などの原因でサブプロセスの開始に失敗して
$!
失敗したサブプロセスのpidではなく、呼び出しプロセスのpidに設定するか、 ""(null)。 -docsalvager
私はbash 4.1スクリプトを書いています...
バックラウンドジョブが常に開始される場合、これらのいずれかが機能します...
cmd &
VAR=$!
or...
( cmd & ); VAR=$!
cmd
が実行されると、最後に開始されたコマンド($!)のpidが必要なものになり、$ VARが正しくなります。
ただし、cmd
が開始しない場合、$ VARは最後のコマンドのpid before beforeになります。 =フォアグラウンドスクリプト自体のpidである可能性がある開始された。後で特定の条件下でプロセスを強制終了するためにcmd
のpidが必要になるので、間違ったpidを取得してもうまくいかない可能性があります。
私が本当に必要なのは、バックグラウンドジョブが実行された場合にのみVARを変更することです。構文的に正しくないようなもの...
VAR=
( cmd & ); && VAR=$!
コメントとジョセフRの答えは非常に役に立ちました。同様の問題を持つ人のために...
次のbash関数は、GtkDialog standby
スクリプトをバックグラウンドで実行します。それ自体がサブプロセスで実行される関数内にあるため、standby
スクリプトが失敗した場合にstandby
スクリプトのPIDではなく、呼び出しスクリプトのPIDを取得しないようにする必要がある分離が提供されているようです。 ...
function standbyBg () {
ifHelpShow "$1" 'standbyBg
Run standby (busy "throbber") in background and echo its pid.
Example:
standbyPID=$(standbyBg)
Revised:
20131123 docsalvager' && return
#
standby >/dev/null 2>&1 &
echo $!
}
ちょっとハックな回避策:
jobs &>/dev/null
cmd &
new_job_started="$(jobs -n)"
if [ -n "$new_job_started" ];then
VAR=$!
else
VAR=
fi
help jobs
に注意を向けてくれた@terdonのコメントに感謝します。