bashスクリプトは、バックグラウンドで実行されているかどうかをどのように検出できますか?


28

bashスクリプトがフォアグラウンドまたはバックグラウンドで実行されているかどうかを知る方法はありますか?そのため、それぞれの場合でわずかに異なる動作をすることができますか?


ジョブ制御のため、プロセスはフォアグラウンドからバックグラウンドへ、またはその逆に移動できることに注意してください。
バーマー14年

1
場合にも、知ることに興味がある可能性があり、スクリプトが対話型シェルから実行されている
GNP

回答:


30

引用man ps

プロセス状態コード

   Here are the different values that the s, stat and state output
   specifiers (header "STAT" or "S") will display to describe the state of
   a process.
   ...
   +    is in the foreground process group

したがって、簡単なチェックを実行できます。

case $(ps -o stat= -p $$) in
  *+*) echo "Running in foreground" ;;
  *) echo "Running in background" ;;
esac

確かに$(...)内で呼び出されるものはすべて、それ自体がバックグラウンドで実行されています....?私は推測するプロセスグループは、それが動作することを否定することはできません、しかし重要なことです。
エドランドール

2

ファイル/etc/bash.bashrcを見てください。

「$ PS1」がある行。次に、「man bash」を実行して、トークンPS1を探します。

[ -z "$PS1" ] && return

インタラクティブではないスクリプトを終了します。


1

これまでのすべてのソリューションには、プロセスの生成などが含まれます.bashrc。bashシェルが起動するたびに呼び出されるため、非常に、いため、これらのソリューションは数千のプロセスの起動を終了します。

多くのクリーナーはbash自体を要求しています。bashには$-、インタラクティブシェルで実行されている場合、「i」を持つ事前定義変数があります。たとえば、これを.bashrcに入れると、はるかにクリーンで安価になり、最も重要なこととして、常に機能します!

case "$-" in 

    *i*) # interactive shell

    ;;
esac

なぜあなたは叫んでいますか?そのルックスは非常に、非常に醜い ...
Pierre.Vriens

シンプルで正しいソリューション。
エドランドール

0

シェルが対話モードで実行されているかどうかを確認しても同じ結果になると考えるかもしれませんが、実際にはそうではありません。概念は似ていますが、実際には異なります。expectのおかげで、バックグラウンドフィード入力でインタラクティブスクリプトを実行できます。また、-l引数を指定してbashを使用してスクリプトを起動することもできます。したがって、スクリプトがバックグラウンドで実行されているか、フォアグラウンドで実行されているかを確認するために、bashの対話性に依存することはできません。

したがってdevnullからの答えは正しいです。プロセスがフォアグラウンドで実行されているかどうかを判断するために、psユーティリティは、プロセスグループ(pgrp)がセッションの制御端末(tpgid)に関連付けられたプロセスグループIDと同じかどうかをチェック+し、プロセスに従って出力に符号を追加します状態。

それを知っているので、テストの純粋なbashバージョンを間違いなく使用できます。

#!/usr/bin/env bash

IFS=$' '
retval=($(</proc/$$/stat))
IFS=$' \t\n'
if [[ "${retval[3]}" == "${retval[7]}" ]]; then
    echo "Background" > ./result.txt
else
    echo "Foreground" > ./result.txt
fi
exit

上記のコードではstdout、プロセスがバックグラウンドで実行されるときに接続されないため、結果をテキストファイルで出力しています。

第四に注意し、表の第八の要素は、それぞれに対応してくださいpgrptpgid参照/ procの/ [PID] / STAT manページのセクションを - man 5 proc)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.