37

シェルスクリプトのプロセスグループを設定するには? また、すべての子プロセスを同じプロセスグループに入れたい

C の setpgid() に似たものを期待しています。

4

6 に答える 6

24

PSkocikが指摘しているように、ほとんどのシェルでは、ジョブ制御 (「モニター モード」) を有効にすることで、プロセスを独自のプロセス グループで実行できます。

(set -m; exec process_in_its_own_group)

Linux には、setsid独自のセッションで引数として渡されたコマンドを実行するユーティリティがあります(同名のシステム コールを使用)。これは独自のプロセス グループで実行するよりも強力ですsetpgrpが、目的には問題ないかもしれません。

プロセスを独自のグループではなく、既存のグループに配置する場合 (つまり、 のフル パワーが必要な場合setpgid)、共通のシェル ユーティリティはありません。C/ Perl /…を使用する必要があります</p>

于 2011-07-01T19:35:32.060 に答える
10

Bourne、bash、または zsh ではそれができないと思いますが、組み込みを使用して perl で実行できますsetpgrp(POSIX とのわずかな名前の違いに注意してください)。perl プロセス自体のグループを変更するには、PID としてゼロを渡します。

setpgrp(0, 12345) || die "$!"

たとえば、bash から perl を使用して bash プロセスのグループを設定できると思うかもしれませんが ($$たとえば、perl スクリプトに渡すことによって)、perl プロセスがプロセスのグループを変更できるとは思いません分岐しませんでした。

やろうとしていることに応じて、さまざまなシェルのジョブ制御機能により、必要なものが別の方法で提供される場合があります。たとえば、端末から切り離したいだけの場合などです。

更新:明確な説明なしに、この回答がいくつかの反対票を受け取ったのは奇妙だと思います。私の推測では、反対票を投じた人たちは、現在のシェルのプロセス グループを変更する方法を尋ねる質問を誤解していると思います。あるいは、シェルから setpgrp を実行する方法を知っていても、秘密を守っているのかもしれません。

于 2011-07-01T18:22:57.887 に答える
0

@Rob Davis が彼の回答で指摘したように、プロセス グループの設定はシェルに必要なものではありません。

代わりに、プロセス制御メカニズムを使用したいと考えています。この回答shは、linuxおよびborneでこれを行うことをカバーしています。要するに:

#! /bin/sh
# Kill all opened jobs on exit.
trap 'kill $(jobs -p)' EXIT

これにより、バックグラウンドで開かれたすべてのジョブが強制終了されます (例: で&)。

于 2016-03-19T18:00:10.200 に答える