シェルスクリプトのプロセスグループを設定するには? また、すべての子プロセスを同じプロセスグループに入れたい
C の setpgid() に似たものを期待しています。
シェルスクリプトのプロセスグループを設定するには? また、すべての子プロセスを同じプロセスグループに入れたい
C の setpgid() に似たものを期待しています。
PSkocikが指摘しているように、ほとんどのシェルでは、ジョブ制御 (「モニター モード」) を有効にすることで、プロセスを独自のプロセス グループで実行できます。
(set -m; exec process_in_its_own_group)
Linux には、setsid
独自のセッションで引数として渡されたコマンドを実行するユーティリティがあります(同名のシステム コールを使用)。これは独自のプロセス グループで実行するよりも強力ですsetpgrp
が、目的には問題ないかもしれません。
プロセスを独自のグループではなく、既存のグループに配置する場合 (つまり、 のフル パワーが必要な場合setpgid
)、共通のシェル ユーティリティはありません。C/ Perl /…を使用する必要があります</p>
Bourne、bash、または zsh ではそれができないと思いますが、組み込みを使用して perl で実行できますsetpgrp
(POSIX とのわずかな名前の違いに注意してください)。perl プロセス自体のグループを変更するには、PID としてゼロを渡します。
setpgrp(0, 12345) || die "$!"
たとえば、bash から perl を使用して bash プロセスのグループを設定できると思うかもしれませんが ($$
たとえば、perl スクリプトに渡すことによって)、perl プロセスがプロセスのグループを変更できるとは思いません分岐しませんでした。
やろうとしていることに応じて、さまざまなシェルのジョブ制御機能により、必要なものが別の方法で提供される場合があります。たとえば、端末から切り離したいだけの場合などです。
更新:明確な説明なしに、この回答がいくつかの反対票を受け取ったのは奇妙だと思います。私の推測では、反対票を投じた人たちは、現在のシェルのプロセス グループを変更する方法を尋ねる質問を誤解していると思います。あるいは、シェルから setpgrp を実行する方法を知っていても、秘密を守っているのかもしれません。
@Rob Davis が彼の回答で指摘したように、プロセス グループの設定はシェルに必要なものではありません。
代わりに、プロセス制御メカニズムを使用したいと考えています。この回答sh
は、linuxおよびborneでこれを行うことをカバーしています。要するに:
#! /bin/sh
# Kill all opened jobs on exit.
trap 'kill $(jobs -p)' EXIT
これにより、バックグラウンドで開かれたすべてのジョブが強制終了されます (例: で&
)。