如何在linux上序列化命令执行?

Emm*_*uel 8 linux background-process

我想确保系统的任何普通用户一次只能运行一个脚本。可以有多个用户登录,并且每个用户只能在其他用户的任何运行命令完成后才能运行一个命令。

很久以前在 UNIX 上,我使用batch带有正确“仅一项任务”队列定义的命令来序列化脚本执行。它解决了许多锁管理问题(它只需要在脚本中设置一个简单的超时)。

现在在 Linux 上,该batch命令的执行方式有所不同,每分钟运行一个任务,任务并行运行,直到达到 1.5 平均负载。

我制作了自己的锁管理 shell 库来序列化执行,但我想知道是否有一个标准命令可以做到这一点。

rra*_*nza 5

flock对此确实非常出色。您可以flock在 shell 脚本的包装器中使用它,在命令行上使用它,或者将它合并到您的脚本本身中。

最好的一点flock是,当它等待时,它不会在繁忙的循环中等待。

当您的进程退出时,它也总是会清除锁flock

如果进程在没有清理的情况下退出(或者如果出现内核恐慌或电源故障......),基于原子文件/目录创建的方法可能会被锁定。

flockLinux 内核使用进行清理工作。

从手册来看,

(
flock -s 200  
# ... commands executed under lock ...
) 200>/var/lock/mylockfile
Run Code Online (Sandbox Code Playgroud)

在这种形式中,您可以将特定的代码块包装在 shell 脚本中。

或者你可以像这样运行它,

/usr/bin/flock /tmp/lockfile command
Run Code Online (Sandbox Code Playgroud)

如果你不想无限期地阻塞/等待,你可以指定一个超时:

-w  --timeout <secs>     wait for a limited amount of time
Run Code Online (Sandbox Code Playgroud)

或者只使用非阻塞参数:

-n  --nonblock           fail rather than wait
Run Code Online (Sandbox Code Playgroud)