标签: sighup

为什么我们需要将 SIGHUP 发送到包含已停止进程的新孤立进程组?

UNIX 环境书中的高级编程(“APUE”)说

考虑一个 fork 子进程然后终止的进程。虽然这没什么不正常的(它一直发生),但如果在父终止时子停止(使用作业控制)会发生什么?孩子将如何继续下去,孩子是否知道自己已成为孤儿?

...

如果进程组不是孤立的,则不同进程组中但在同一会话中的父进程之一可能会重新启动非孤立进程组中已停止的进程。

...

由于父进程终止时进程组是孤立的,并且进程组包含一个停止的进程,POSIX.1 要求新孤立进程组中的每个进程都发送挂断信号(SIGHUP),然后是继续信号(SIGCONT) )。

如果只是担心停止的进程在其进程组变为孤立后没有机会被唤醒,为什么内核在其进程组变为孤立时不发送 SIGCONT,为什么还需要发送 SIGHUP?

linux signals process-groups sighup

6
推荐指数
1
解决办法
639
查看次数

为什么在 RHEL 的 logrotate 中使用 kill -HUP?在所有情况下都需要吗?

我看到 syslog 日志记录,使用了 kill -HUP。

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
Run Code Online (Sandbox Code Playgroud)

我知道使用 -HUP 是因为像 syslog 这样的守护进程在捕获 SIGHUP 时会尝试重新启动,因此所有打开的文件都将被刷新。

我不明白为什么他们需要刷新。

如果 syslog 仅将新日志附加到日志文件,则打开的文件将处于写入模式。如果是这种情况,当发生日志切换并且在文件系统中的旧日志文件条目被删除时,它是否会在需要附加新日志行时自动创建一个新文件(毕竟 syslog服务以 root 身份运行)?

我认为差异更多在于对 w 和 u 模式的理解。我无法快速得出结论。

另外,为什么只使用kill -HUP,为什么不重新启动服务。会有什么不同吗?

logrotate signals rsyslog syslog sighup

4
推荐指数
1
解决办法
1万
查看次数

惊喜:Interactive Bash 在单独的进程组中运行命令

让我惊讶的是,至少从 Bash 4.4.19 开始,Interactive Bash 在单独的会话中运行命令,运行后请参阅以下进程列表sleep 8888

PGID    PID       PPID
3150071 3150071  252603     -bash
3194323 3194323 3150071       sleep 8888
Run Code Online (Sandbox Code Playgroud)

您可以看到PGIDofsleep不等于 bash,而其 PPID 等于。

测试在 Ubuntu Bionic 上完成。

有关于这种行为改变的任何文档吗?或者从一开始就一直如此?

在单独的会话中运行命令意味着 bash 退出时根本不会发生 SIGHUP 效果,也许这就是为什么https://www.sobyte.net/post/2022-04/linux-nohup-setsid-disown/#about -

事实上,在较新版本的 bash 上,bash 不会向后台程序发送 SIGHUP 命令。这意味着任何在后台运行的以 & 结尾的进程都不会被终端退出的 SIGHUP 信号退出。

编辑:我应该使用术语“进程组”而不是“会话”。

bash session sighup

3
推荐指数
1
解决办法
286
查看次数

nohup是否只适用于shell进程的子进程,而不适用于非shell进程的子进程?

nohup 是一个外部程序。如何将 shell 进程的子进程的 SIGHUP 操作更改为“忽略”?fork()(就子进程调用时的一些参数和/或execve()nohup 之后的程序而言?)

nohup是否只适用于shell进程的子进程,而不适用于非shell进程的子进程?

谢谢。

nohup sighup

2
推荐指数
1
解决办法
1301
查看次数

为什么关闭终端模拟器窗口会终止 bash 进程,而 SIGHUP 陷阱更改为不终止?

在 lxterminal 的终端仿真器窗口中的 bash shell 中,我运行

$ trap "echo hello" SIGHUP 
$ kill -s HUP $$
hello
$
Run Code Online (Sandbox Code Playgroud)

然后我关闭终端模拟器窗口。

关闭终端模拟器窗口是否只会导致 SIGHUP 发送到控制进程,即 bash 进程?

由于 SIGHUP 陷阱不会终止 bash 进程,我希望 bash 进程不会终止,但为什么 bash 进程实际上已终止?

如果我将陷阱更改为""(忽略),也会发生同样的事情。

终端模拟器很重要。在 xterm 窗口中运行的 bash 中,将 trap 设置为""将使 xterm 窗口不可关闭,而将 trap 设置为echo hello仍然可以关闭 xterm 窗口。

谢谢。

linux bash terminal-emulator signals sighup

1
推荐指数
3
解决办法
649
查看次数