独自のプロセスグループでbashスクリプトを起動する方法

独自のプロセスグループでbashスクリプトを起動する方法

他のbashスクリプトからbashスクリプトを起動したいのですが、端末で実行するのと同じように、独自のプロセスグループから起動します。

同様の質問がいくつかありますが、私の例と一致する答えが見つかりませんでした。

これら2つのスクリプトを使用してください

$ cat main.sh 
#! /usr/bin/env bash

set -e

echo if this has been started in its own group the following will pass
ps -o ppid,pgid,command $$
ps -o pgid | grep $$
echo passed

$ cat wrapper.sh 
#! /usr/bin/env bash

set -e

./main.sh

単独で実行するmain.shと、端末はこれを独自のグループに入れます。

$ ./main.sh 
if this has been started in its own group the following will pass
 PPID  PGID COMMAND
20553  1276 bash ./main.sh
 1276
 1276
 1276
passed
$ echo $?
0

main.shただし、テストを実行するとwrapper.sh失敗します(予想どおり)。

$ ./wrapper.sh 
if this has been started in its own group the following will pass
 PPID  PGID COMMAND
 2224  2224 bash ./main.sh
$ echo $?
1

しかし、端末で直接実行するときなど、自分のグループで実行するようにしたり、wrapper.sh何を入れる必要がありますか?main.shmain.sh

(実際に違いがあれば./main.sh &実行したいのですが、wrapper.shこの実験ではフォアグラウンドで実行する方が簡単です。)

(私はUbuntu 18を使用しています)

ベストアンサー1

Bashを使用すると仮定すると、コマンドラインで使用するか、set -m「監視モード」(タスク制御)を有効にするのが簡単な答えです。-m

マニュアルページから:

-m モニターモード。ジョブ制御が有効になりました。このオプションは、それをサポートするシステムの対話型シェルに対してデフォルトで有効になっています(上記のタスク制御を参照)。すべてのプロセスは別々のプロセスグループで実行されます。バックグラウンドジョブが完了すると、シェルは終了ステータスを含む行を印刷します。

$ bash -m wrapper.sh 
if this has been started in its own group the following will pass
 PPID  PGID COMMAND
12630 12631 bash ./main.sh
12631
12631
12631
passed

しかし、「理由」に関する質問は非常に厳しく、非対話型シェルでモニタモードがデフォルトで無効になっている理由がある可能性があるため、YMMVがあります。

おすすめ記事