Linux系统管理里,PID文件属于常见且关键的概念,它本质上是纯文本文件,其仅有的作用是记录某个守护进程运行时的进程标识符,理解它的存在意义,掌握正确使用方法,明白潜在问题,对确保服务稳定运行,实现可靠进程管理极其重要。

什么是Linux中的PID文件

PID文件的创建,一般是在守护进程启动时进行的且由其完成,在写入了自身的进程ID之后,便会被放置于一个标准的位置,像是/varrun/这个目录之下。这样一个简单的动作为此给予了系统管理中清晰的“句柄”。对于管理员或者自动化脚本而言,不用去猜测进程列表或者遍历它,仅仅通过读取这个文件,便能够精确取出目标进程的PID 。

linux pid文件_文件柜_文件夹

尽管文件内容堪称简易,然而其意义却极为重大,它构建起了一个具备持久化特性的、可供机器读取的一种契约,此契约声明了“这个服务正凭借此PID处于运行状态”,众多初始化脚本以及服务管理工具,像传统的/etc/init.d/脚本或者start-stop-daemon,都严重依赖着PID文件去检查服务状态、发送信号或者防止服务重复启动。

PID文件通常存放在哪个目录

依照历史所形成的惯例以及文件系统层次结构拟定的标准而言,PID文件标准的存放目录是/var/run/ ,此目录专门被用来专门于存放起始自系统启动之后的运行时所产生的信息,像套接字文件以及进程状态文件这类 ,把PID文件集中放置在这个地方,有利于管理并且契合系统规范linux pid文件,比如/var/run/nginx.pid或者/var/run/mysqld/mysqld.pid

文件柜_linux pid文件_文件夹

可是,在现代Linux的发行版本当中,/var/run一般来讲是一个指向/run目录的符号链接,/run属于一个内存文件系统,它储存的是容易丢失那种运行时的数据,这就表明PID文件于系统重启以后会不见,这是契合其生命周期特性的,有些服务或者管理员也会挑选把PID文件放置在别的目录,像应用自身的配置目录之下,然而这并非是最佳的做法。

为什么守护进程需要创建PID文件

将守护进程创建PID文件的首要目的设定为达成可靠的进程管理,在系统管理员有重启操作需求,并附带停止请求或查询服务状态的状况下,一个具备权威性质的PID来源能够确保相关操作的精准无误,就像在执行systemctl stop nginx这个指令时,系统会去读取与之对应的PID文件,以此来寻找到正确的进程,进而发送TERM信号。

linux pid文件_文件夹_文件柜

一个设计良好的启动脚本,在启动服务之前它会先进行检查,检查对应的PID文件处于何种状态是否还在世间存在,以及该PID所对应的进程其情况又是怎样是否仍旧在运行之中。要是检查的结果能够顺利通过关隘linux串口驱动,那么它就有可能会拒绝再次启动之行径,以此来避免端口出现冲突或者资源产生竞争的不利状况情形。它被构建成为一种简单且有效的单实例运行能够保障其顺利运行的机制。

如何正确创建和删除PID文件

并非只是单纯地打开文件再写入数字这般轻易地就能创建PID文件。可靠的创建进程得要将并发以及原子性纳入考虑范畴。最佳的实践做法是:进程一旦启动,立马就要获取自身的PID,接着以独占写入的模式去创建文件并把PID写入其中。许多编程语言的库函数都针对此逻辑做了封装,像Python的pidfile模块就是这样。

删掉PID文件的那个时机同样是很重要的,在理想的状况之下,应当是在进程优雅地终止的时候linux pid文件,由进程自身去清理它的PID文件,若要是进程被强行地杀死了,PID文件就将会变成“僵尸文件”linux vi 命令,所以说,服务启动脚本在启动之前必须得包含清理陈旧PID文件的逻辑,去检查文件里的PID是不是对应着一个存活的进程,要是并非如此,那就得安全地删除这个文件,以此来确保服务能够正常地重启。

文件夹_linux pid文件_文件柜

PID文件可能引发哪些问题

PID文件机制虽说简单,然而却极易引入问题,最常见的当属所谓的“僵尸PID文件”,也就是文件是存在的,可是与之对应的进程却已然不存在了,这一般是因为进程出现崩溃,或者是被强制杀死之后却没有清理文件所导致的,在这类情况下,服务启动脚本会错误地认为服务依旧在运行,进而阻碍服务进行重启,对系统可用性造成影响。

再一个问题在于权限以及所有权部分哈,当守护进程以root身份启动之后将权限降低进行运行,然而 PID 文件却是在权限降低之前就被创建出来了,这样的话就具备了致使权限降低之后的进程没有权力去修改或者删除该文件的可能性,除此之外哈,要是 PID 文件的目录针对于非特权用户是可以进行写入操作的,那么就有可能会带来安全方面的风险,就好比恶意用户去创建虚假的 PID 文件以此来干扰服务管理这种情况。

如何检查和处理陈旧的PID文件

文件夹_文件柜_linux pid文件

日常维护之中存在着处理陈旧PID文件这个部分,手动进行检查之际,能够运用cat命令去查看PID文件所包含的内容,之后运用ps -p 。下达指令去验证那个PID是不是存在着。要是进程并不存在,那么就能够安全删除那个文件。一组通用的命令组合是:、[ 并非 -f /var/run/service.pid ] || 杀掉 -0 将 $(cat /var/run/service.pid) 的结果作为参数传入 2 输出重定向到 /dev/null || 删除 -f /var/run/service.pid 。

自动化脚本当中应当集成更为健壮的逻辑,标准的做法是,当我们运行自动化脚本时,在尝试启动服务以前,脚本会去检查PID文件路径。要是文件是存在的,那么就会向文件里头记录的PID发送一个信号0(此信号仅仅是用来检查进程是不是存在的),要是发送失败了那就表明进程已经死掉了,紧接着就会删除旧文件。好多现代服务管理工具像systemd,尽管自身是使用cgroup来管理进程的,但是为了兼容性,依旧会去处理传统的PID文件。

于针对运用传统PID文件机制的服务开展管理期间,你有无碰到过因僵尸PID文件致使服务没法重启的棘手状况呢?你最终是以怎样的方式去排查并搞定此问题的呢?欢迎于评论区去分享你的经验与故事,要是觉着本文对你有益处,请点赞并分享给更多同行。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复