命令/工具来防止多次运行一个应用程序

我想知道是否有一些工具/应用程序,可以防止另一个工具/应用程序运行不止一次。 我知道这可以通过使用pidfile手动完成,但不是有一些工具呢?

像:/ bin / ruonce / bin / myApp

当应用程序在后台第一次产生时,它将返回0,当它已经在运行时1。

在OpenRC中,start-stop-daemon接近,但是不必要的复杂而不是独立的。

有一个简单的实用工具叫做flock ,它将一个进程封装在一个lockfile中,并默认创build一个独占锁。 这意味着,如果前一个调用仍在运行,则由flock文件包装的进程的后续运行将失败。

你也可以告诉羊群立即失败,而不是等待locking:

 flock -xn /bin/yourcmd 

这个二进制文件是util-linux软件包的一部分,默认情况下你的发行版可以使用这个软件包。

您可以在脚本中使用lockfile例程 (通常是一个目录)来执行此操作… PID是处理此问题的正确方法,但locking文件可能是实现您想要的快捷方式。 另请参阅此StackOverflow解决scheme 。

一个经常使用的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; 

没有别的想法。

但是,你想要的是一个你可以轻松写出的脚本。 要求将是(不是按照程序的顺序):

  • 启动过程并以某种方式存储PID,以唯一标识正在运行的程序
  • 检查是否有PID文件,其中的PID对应于该程序的现有实例; 如果是这样,则放弃; 如果没有,则照常开始处理并更换PID文件
  • 返回你的状态

这是start-stop-daemon的很多function,所以它会让人怀疑为什么不简单地忽略那些你不需要的function,并使用它。 你甚至可以制作一个脚本或别名来包装它,这样你可以键入一个非常less量的字符。

出于利益的考虑,您也可以在不使用PID文件的情况下执行此操作,并通过在您的脚本中使用pidof来捕获以特定文件名(而不是path名)运行的所有进程是否“正常”启动。