我想确保系统的任何普通用户一次只能运行一个脚本。可以有多个用户登录,并且每个用户只能在其他用户的任何运行命令完成后才能运行命令。
很久以前,在 UNIX 上,我使用batch
具有正确“仅一个任务”队列定义的命令来序列化脚本执行。它解决了很多锁管理问题(它只需要在脚本中设置一个简单的超时)。
现在在 Linux 上,batch
命令执行不同,每分钟运行一个任务,任务并行运行,直到达到 1.5 平均负载。
我制作了自己的锁管理 shell 库来序列化执行,但我想知道是否有标准命令可以做到这一点。
flock
非常适合这一点。您可以flock
在 shell 脚本周围使用包装器,在命令行上使用它,或将其合并到脚本本身中。最好的一点
flock
是,当它等待时,它不会在繁忙的循环中等待。当您的进程退出/退出时,它也总是清理锁
flock
。如果进程在没有清理的情况下退出(或者如果出现内核恐慌,或电源故障,......),基于原子文件/目录创建的方法可能会被锁定。
使用
flock
,Linux 内核进行清理。从说明书来看,
在这种形式中,您可以在 shell 脚本中包装特定的代码块。
或者你可以像这样运行它,
如果您不想无限期地阻止/等待,则可以指定超时:
或者只使用非阻塞参数:
也许您在这里想要的是用户可以运行的进程数量的硬性限制?确保包括他们的 shell 进程以及在他们的会话期间需要运行的任何其他必要的东西。
这可以在 /etc/security/limits.conf 中添加如下一行:
请注意,如果尝试一次运行的东西太多,这将引发无法分叉的错误。将 2 更改为适合您的需要,并将“testuser”更改为您要限制的用户。
使用
mkdir
which 是一个原子进程来锁定其他进程。当时只有一个可以创建目录:如果您先运行脚本,它将读出:
如果有人尝试同时运行它,输出将是: