在 Bash 中关闭监视器模式

0 bash

Bashman列出了set小节下的选项-m描述如下:

监控模式。作业控制已启用。对于支持它的系统上的交互式 shell,默认情况下启用此选项(请参阅上面的 JOB CONTROL)。后台进程在单独的进程组中运行,并在完成时打印一行包含其退出状态的行。

(要在链接页面上找到它,搜索“监控模式”,只有一个点击。)

问题是这种模式是否可以在 bash 会话期间有效关闭,如何以及预期结果如何?我一直在尝试尝试,但到目前为止没有结果。

我知道命令set +m,但它应该导致什么?关闭作业控制?使作业完成和终止消息静音?

Gil*_*il' 5

set +m确实禁用了监视模式(也称为作业控制),但这并没有太大影响,而且其中大部分都不是有用的效果。当在关闭监视器模式的情况下启动后台作业时,该作业不符合fgand 条件bg,并且当作业终止、停止或恢复时,shell 不会执行打印消息或执行 SIGCLD 陷阱。

主要有用的区别是监视器模式导致管道在它们自己的进程组中运行。当您想要终止整个进程组时,这是一个有用的考虑因素。如果监视模式被禁用,那么杀死 shell 的进程组也会杀死它的子进程,如果它被启用,那么每个管道都是它自己的组并且可以独立地被组杀死。

bash-4.3$ 设置 -m
bash-4.3$ 睡眠 1111 &
[1] 17526
bash-4.3$ 设置 +m
bash-4.3$ 睡眠 2222 &
[2] 17527
bash-4.3$ ps -o pid,ppid,pgid,sid,cmd 17526 17527
  PID PPID PGID SID CMD
17526 17525 17526   7773 睡眠 1111
17527 17525  17525   7773 2222睡觉