「set -m」が何をしているかを詳しく説明できる人はいますか?

「set -m」が何をしているかを詳しく説明できる人はいますか?

存在するマニュアルページ、それはただ次のように言います:

-m はジョブ制御を有効にします。

しかし、これは実際に何を意味しますか?

私はこのコマンドを1つで見つけました。だから質問は、「ファブリックがtomcatを起動できません」というOPと同じ問題があります。set -m問題を解決しました。 OPが少し説明しましたが、よく理解していません。

問題は、コマンドが終了すると終了するため、バックグラウンドジョブにあります。

解決策は簡単です。コマンドの前に "set -m;"プレフィックスを追加します。

ベストアンサー1

bashドキュメントの引用(からman bash):

JOB CONTROL
       Job  control  refers to  the  ability  to selectively  stop
       (suspend) the execution of  processes and continue (resume)
       their execution at a later point.  A user typically employs
       this facility via an interactive interface supplied jointly
       by the operating system kernel's terminal driver and bash.

したがって、非常に簡単に(対話型シェルのデフォルト値)を使用すると、set -m(非対話型シェルのデフォルト値)で無効になる組み込み機能を使用できます。fgbgset +m

ただし、ジョブ制御と終了時のバックグラウンドプロセスの終了間の接続は明らかではありませんが、1つがあることを確認できます。set -m; (sleep 10 ; touch control-on) &そのコマンドを入力した直後にシェルを終了すると、run を実行するとファイルが生成されますが、set +m; (sleep 10 ; touch control-off) &満たされません。

私はその答えが以下の文書の残りの部分にあると思いますset -m

-m      Monitor  mode. [...]                     Background pro‐
        cesses run in a separate process group and a  line  con‐
        taining  their exit status is printed upon their comple‐
        tion.

これは、開始されたバックグラウンドジョブがset +m実際の「バックグラウンドプロセス」ではないことを意味します(「バックグラウンドプロセスは、端末のプロセスグループIDとは異なるプロセスグループIDを持つプロセスです」)。その操作を開始したシェルと同じプロセスグループIDを共有します。独自のプロセスグループIDを持つ代わりに。プロセスグループは適切なバックグラウンドプロセスと同じです。これは、いくつかのバックグラウンド操作の前にシェルがシャットダウンしたときに観察される動作を説明します。正しく理解した場合は、シャットダウンすると、シェルと同じプロセスグループ内のプロセスにシグナルが送信されます(したがって、開始されたバックグラウンドジョブが終了しますset +m)。他のプロセスグループのプロセス(したがって、以下で開始された実際のバックグラウンドプロセスは考慮されませんset -m

したがって、あなたの場合、スクリプトはバックグラウンドstartup.shジョブを開始できます。このスクリプトが非対話型(たとえば、リンクされた質問のようにSSHを介して)で実行されると、ジョブ制御は無効になり、「バックグラウンド」ジョブはリモートシェルのプロセスグループを共有するため、シェルが終了すると終了します。代わりに、そのシェルでジョブ制御を有効にすると、バックグラウンドジョブは独自のプロセスグループを取得し、親シェルが終了すると終了しません。

おすすめ記事