最近研究了一下,如何基于 coturn 的日志来统计服务用量。
考虑到生产环境中的日志文件不能无限增大,需要配合 logrotate 做日志轮转。同时,为了避免日志丢失,也不能使用 copytruncate 模式。
这样一来,当日志文件被轮转时(例如将 turnserver.log 重命名为 turnserver.log.1),就需要让 coturn 重新打开日志文件,否则它仍然会继续写入已经改名后的那个文件(因为进程持有的是文件描述符,而文件重命名并不会影响已经打开的文件)。
这时候,就要用到 SIGHUP 信号了。向 coturn 发送一个 SIGHUP 信号,它就会重新打开日志文件,之后新的日志便会写入新创建的 turnserver.log 中。
在 Linux/Unix 系统中,很多守护进程(Daemon)都会响应 SIGHUP 信号,其最常见的用途,就是通知服务重新读取配置文件,而无需重启整个进程。
SIGHUP 的本意是 Hang Up(挂断)。在早期的 Unix 系统中,它表示终端连接已经断开,系统默认行为是终止进程。
后来,由于守护进程本身并不依赖终端运行,开发者便逐渐赋予了 SIGHUP 新的含义:在不中断服务的情况下重新加载配置,或重新打开日志文件。如今,SIGHUP 已经成为 Unix 世界约定俗成的“Reload”信号。🔄
我比较好奇,常见的守护进程都是如何使用 SIGHUP 的,于是问了一下 AI。它给出的结果大致如下:
- • Nginx:重新加载配置,并重新打开日志文件,
nginx -s reload 的底层就是向主进程发送 SIGHUP。 - • Apache HTTP Server(httpd):重新加载配置并优雅地重新启动工作进程。
- • PostgreSQL:重新读取配置文件(如
postgresql.conf)。 - • MySQL / MariaDB:重新打开日志文件,部分配置会重新加载,但并不会完整重新读取配置文件。
- • OpenSSH(sshd):重新读取
sshd_config 配置文件。 - • BIND(named):重新加载配置和区域数据。
当然,并不是所有程序都会把 SIGHUP 当作“重新加载配置”来处理,也有一些程序会用它来重新打开日志文件,或者干脆保持默认行为,收到信号后直接退出。因此,具体行为还是要查看各个程序的文档。📚
您在什么场景下使用过 SIGHUP 信号呢?欢迎留言分享。
(完)