阻止我的软件的第二个实例启动

阻止我的软件的第二个实例启动

我编写了一个服务脚本来在启动时运行特定的软件。如何限制该软件使其不再手动运行?

我的意思是软件在内存中只能有一个实例。

我不想更改我的软件的源代码,我想为我初始化这项工作。

答案1

这应该适用于 bash 脚本。如果发现外部软件的另一个实例,它将中止脚本的执行。这里的关键是`pidof。

#!/bin/bash

# Abort startup if another instance was found    
pidof /path/to/software.executable > /dev/null && {
  echo Sorry. Only one instance allowed.
  exit
}

或者,您可以使用锁定文件,替换正在运行的实例(即首先终止正在运行的实例,然后允许运行)。

然而,专家用户可以绕过此脚本并直接调用外部命令。

答案2

您可以指示 init 仅运行软件的一个实例 — 事实上,如果您从 init 启动软件,这种情况就会自然发生。但 init 的工作与阻止其他程序启动软件的其他实例无关。

如果您想确保程序仅运行一个实例,则不要直接运行程序,而是运行一个包装脚本来检查您的软件是否已在运行。LatinSuD 的回答给出了此类包装脚本的示例。

当然,用户可以绕过包装器脚本并运行软件的另一个实例。但用户也可以创建一个与您的文件完全相同的可执行文件并运行它。因此,通过包装器脚本确实以有意义的方式实现了所需的限制。

运行同一可执行文件的多个实例本身并不是问题。可能出现问题的是,如果它们访问相同的资源:文件、网络端口等。如果您需要防止对同一资源的并发访问,则可能的方法取决于资源是什么。如果资源是 TCP 或 UDP 端口,则无论如何只有一个进程可以侦听该端口。如果资源是文件,请确保只有运行由 init 脚本启动的实例的用户有权访问该文件。

答案3

旧线程,但值得在这里写一些注释:如果在“/bin/bash /tmp/my_script.sh”或“python my_script.py”等父级下运行进程,请使用以下命令:

pgrep -l my_script.sh >/dev/null && echo "Another process is running" || { 
do your stuff;
}

答案4

实际上,明智的方法是使用正确的权限拒绝用户访问,只允许 root(类似)用户运行该软件。

相关内容