加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

从bash脚本启动新进程组

发布时间:2020-12-16 01:49:00 所属栏目:安全 来源:网络整理
导读:我基本上想在新进程组中运行一个脚本(调用更多脚本),以便我可以向脚本调用的所有进程发送信号. 在Linux中,我发现setsid可以帮助我做到这一点,但这在FreeBSD上是不可用的. setsid的语法(由util-linux-ng提供). setsid /path/to/myscript 然而,我了解到会话和
我基本上想在新进程组中运行一个脚本(调用更多脚本),以便我可以向脚本调用的所有进程发送信号.

在Linux中,我发现setsid可以帮助我做到这一点,但这在FreeBSD上是不可用的.

setsid的语法(由util-linux-ng提供).

setsid /path/to/myscript

然而,我了解到会话和进程组不一样.但是开始一个新的会议也解决了我的问题.

解决方法

会话和小组不是一回事.让我们干净利落:

会话由一个或多个进程组组成,并且可以具有控制终端.当会话具有控制终端时,会话在任何时刻恰好具有一个前台进程组和一个或多个后台进程组.在这种情况下,前台进程组中的每个进程都可以看到所有终端生成的信号和输入.

此外,当会话具有控制终端时,shell进程通常是会话负责人,指示哪个进程组是前台进程组(隐式地使其他组成为后台进程组).组中的进程通常由线性管道放在那里.例如,ls -l | grep a | sort通常会创建一个新的进程组,其中ls,grep和sort存活.

支持作业控制的shell(也需要内核和终端驱动程序的支持),就像bash一样,为每个被调用的命令创建一个新的进程组 – 如果你调用它来在后台运行(使用& notation),该进程组没有得到终端的控制权,而shell使它成为后台进程组(并且前台进程组仍然是shell).

所以,正如您所看到的,在这种情况下,您几乎肯定不想创建会话.您想要创建会话的典型情况是,如果您正在守护进程,但除此之外,创建新会话通常没什么用处.

您可以将脚本作为后台作业运行,正如我所提到的,这将创建一个新的进程组.由于fork()继承了进程组ID,因此脚本执行的每个进程都将位于同一个组中.例如,考虑这个简单的脚本:

#!/bin/bash

ps -o pid,ppid,pgid,comm | grep ".*"

这打印如下:

PID  PPID  PGID COMMAND
11888 11885 11888 bash
12343 11888 12343 execute.sh
12344 12343 12343 ps
12345 12343 12343 grep

如您所见,execute.sh,ps和grep都在同一进程组(PGID中的值)上.

所以你想要的只是:

/path/to/myscript &

然后你可以用ps -o pid,comm |来检查myscript的进程组ID grep myscript.要向组发送信号,请将其发送给组长(PGID是组长的PID).发送到组的信号将传递到该组中的每个进程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读