我想知道是否有一些工具/应用程序可以阻止另一个工具/应用程序多次运行。我知道可以使用 pidfile 手动完成,但没有工具可以做到这一点吗?
例如:/bin/ruonce /bin/myApp
当应用程序第一次在后台启动时,它将返回 0;当应用程序已经在运行时,它将返回 1。
OpenRC 中有一个接近的 start-stop-daemon,但是它不必要地复杂并且不独立。
答案1
有一个简单的实用程序,flock
它将把一个进程包装在一个锁文件中,并默认创建一个独占锁。这意味着,如果前一个调用仍在运行,则 flock 文件包装的进程的后续运行将失败。
您还可以告诉 flock 立即失败而不是等待锁:
flock -xn /bin/yourcmd
该二进制文件是软件包的一部分util-linux
,在您选择的发行版上应该默认可用。
答案2
您可以使用锁文件常规(通常是目录)在您的脚本中... PID 是处理此问题的正确方法,但锁定文件可能是实现所需目的的快速方法。另请参阅此 StackOverflow 解决方案。
下面是我经常使用的 Perl 脚本的一个示例及说明。该脚本每次只能运行一个实例:
# Set two variables that are used by the code that ensures that only
# one Orca process is using a particular configuration file at a
# particular time. This is done by using the fact that mkdir() is
# atomic. The first variable is the name of the directory to create
# and the second is a flag used by the Orca clean up code to see if
# the locking directory should be removed.
my $locking_directory = "$config_filename.lock";
my $rmdir_locking_directory = '';
# Install signal handlers to clean Orca up, including the locking
# directory.
$SIG{INT} = \&catch_signal;
$SIG{PIPE} = \&catch_signal;
$SIG{TERM} = \&catch_signal;
$SIG{__DIE__} = \&catch_die;
# Now try to create the locking directory.
unless (mkdir($locking_directory, 0755)) {
die "$0: cannot create locking directory '$locking_directory': $!\n";
}
$rmdir_locking_directory = 1;
答案3
什么都想不起来。
但是,您需要的是可以轻松编写的脚本。要求如下(不按编程顺序):
- 启动进程并以某种方式存储 PID,以唯一标识正在运行的程序
- 检查是否存在 PID 文件,其中的 PID 是否对应于该程序的现有实例;如果是,则中止;如果没有,则正常启动该过程并替换 PID 文件
- 返回您的状态
这是 start-stop-daemon 的大部分功能,因此它确实让人想知道为什么你不简单地忽略你不需要的功能并使用它。你甚至可以制作一个脚本或别名来包装它,这样你就可以输入很少量的字符。
出于兴趣,您还可以在没有 PID 文件的情况下执行此操作,并通过pidof
在脚本中使用来捕获使用特定文件名(而非路径名)运行的所有进程,无论是否“正确”启动。