服务器使用 systemctl restart nginx
重启了一下Nginx,报了一个没遇到的错:
nginx.service: Failed to set a watch for PID file /run/nginx.pid: No space left on
,然而使用 df -h /run
查看,磁盘空间并没有满
使用 touch 命令新建 /run/nginx.pid 文件也没有用,restart nginx 报错信息没有变化,新建的 /run/nginx.pid 文件也被自动删除了
报错信息提到 Failed to set a watch
,查找资料(问GPT)后发现,是由于inotify监视器数量设置的太小,使用 cat /proc/sys/fs/inotify/max_user_watches
or sysctl fs.inotify.max_user_watches
查看,仅仅是8192
!(image2.png)
在 /etc/sysctl.conf
文件末尾追加 fs.inotify.max_user_watches=524288
, 重启nginx,一切恢复正常。
相关补充:
inotify 是 Linux 内核中的一个机制,用于监视文件系统事件。它允许程序监视文件或目录的变化,并在文件被修改、删除、创建等时发出通知。inotify 对文件系统的监控提供了一种高效的方式,避免了程序使用轮询(polling)来检测文件的变化。 fs.inotify.max_user_watches 定义了某个用户在其所有进程中能够创建的 inotify 监视器的总数量上限。 当监视器数量达到上限时,系统将无法再监控更多文件,这会导致错误,如 “No space left on device”。
PID 文件是 Linux 系统中常见的机制,用来记录某个服务的主进程 ID。 /run 目录(以前是 /var/run)是一个临时文件系统,系统启动时由内核挂载。该目录中的文件是临时的,系统重启后会被清除,通常用于存放进程的 PID 文件、套接字文件等短期存在的文件。 当 Nginx 启动时,它会根据配置文件中指定的路径创建一个 PID 文件,默认路径为 /run/nginx.pid
sysctl 是 Linux 和类 Unix 操作系统中的一个工具,用于 查看和动态修改内核参数。这些内核参数影响操作系统的网络、进程、内存管理、文件系统等方面的行为。 内核参数通常存储在 /proc/sys/ 目录下的文件中,sysctl 通过读取和修改这些文件来查看或更改内核配置。例如,/proc/sys/net/ipv4/ip_forward 文件存储了是否启用 IP 转发的设置。 要让修改永久生效(即系统重启后仍然保持),可以编辑 /etc/sysctl.conf 文件,或将配置添加到 /etc/sysctl.d/ 目录中的文件。