这个问题是关于一个脚本,该脚本持有一个锁以防止同时执行其自身的多个实例,该脚本由各种进程在特定时间执行,并在特定情况下发送重启命令。
假设请求重新启动,并且脚本休眠几秒钟(以防止在重新启动开始之前释放锁定)。然后脚本将收到信号并自行结束(从而释放锁定)。
问题:是否存在一个可能的时间窗口,其中该脚本已被重启事件停止,但仍有一些其他进程正在运行并设法再次启动该脚本?
我个人的感觉是,Linux 系统首先会切换到某种状态,在该状态下,通常不会执行新进程,然后正在运行的进程会停止。但这只是一厢情愿的想法,因为我找不到相关文档。
一些澄清:
a) 这与锁定文件未正确删除无关。当我使用 flock 时,脚本结束时锁定就会消失,即使在崩溃的情况下也是如此。
b) 大多数情况下,脚本由 at 守护进程以 root 权限启动。
答案1
您的个人感受有一定的道理。
我不会讲得太多,但 Linux 启动过程可以总结如下。(可能会有变化,因为 init 不再是默认的)。
- 引导加载程序将控制权移交给 Linux 内核和
init
。 init
然后检查清单并开始遍历其运行模式init
进入运行级别 1。这也称为单用户模式,在此模式下,系统将启动正常运行所需的基本服务。只有属于 root 的进程才能启动。init
进入运行级别 2。与上述类似,但是是多用户模式。其他用户的进程加入进来。- 运行级别 3 启动网络。
- 4 被跳过(我从来不明白为什么。我猜是永久保留以备将来使用)。
init
而是直接转到 5,这是xorg
启动的地方。许多用户空间服务(网络服务器、邮件等)通常都是从这里启动的。
现在,回答你的问题,我发现该脚本在关闭系统的过程中启动的可能性很小。如果我没记错的话,在此过程中无法以正常方式启动新进程。据我所知,主要担心的是脚本会启动并留下一个锁定文件,该文件会在重新启动期间留下,从而阻止脚本运行,对吗?在这种情况下,我会做一个小的启动脚本,可能在运行级别 3 上,如果找到该锁定文件,它会删除它。