如何在UNIX(SunOS)上包装可执行文件,使其不会同时运行多次?

如何在UNIX(SunOS)上包装可执行文件,使其不会同时运行多次?,unix,executable,wrapper,sunos,Unix,Executable,Wrapper,Sunos,我有一个需要包装的可执行文件(无源代码),以确保一次调用不超过一次。我马上想到了某种队列包装器,但我实际上如何使它能够调用我的包装器,而不是调用可执行文件本身呢?有更好的方法吗?解决方案需要不可见,因为用户是其他应用程序。欢迎提供任何信息/建议。如果用户是其他应用程序,您可以重命名可执行文件(例如name->name.real)并使用原始名称调用包装器。为了确保一次只调用一次,您可以使用pidof命令(例如pidof name.real)来检查程序是否已经在运行(pidof实际上提供了运行进程的

我有一个需要包装的可执行文件(无源代码),以确保一次调用不超过一次。我马上想到了某种队列包装器,但我实际上如何使它能够调用我的包装器,而不是调用可执行文件本身呢?有更好的方法吗?解决方案需要不可见,因为用户是其他应用程序。欢迎提供任何信息/建议。

如果用户是其他应用程序,您可以重命名可执行文件(例如name->name.real)并使用原始名称调用包装器。为了确保一次只调用一次,您可以使用
pidof
命令(例如
pidof name.real
)来检查程序是否已经在运行(
pidof
实际上提供了运行进程的PID,这样您就可以使用
kill
或任何东西向其发送信号)方法1:将可执行文件放在标准路径以外的位置。创建一个shell脚本,用于检查sentinel文件,如果缺少sentinel文件,则执行程序,等待ptogram完成,然后删除sentinel文件。如果存在sentinel文件,脚本将进入一个短延迟的循环(1秒?此程序的标准执行时间是多长?取一半),再次检查语句文件,依此类推


方法2:创建一个单独的程序,该程序执行与脚本相同的操作,但使用系统级信号量或锁。您甚至可以简单地对文件使用读/写锁。程序将在实际程序上执行fork()和exec(),在清除sentinel之前等待子级退出。

如果不小心执行,这两种方法都可能导致争用条件(例如,如果两个进程检查并发现sentinel文件不存在,然后两个进程都尝试创建它)。仔细选择原子操作,例如在已知位置创建目录,并确保操作成功。同意,这就是我个人喜欢选项2的原因。如果试图创建目录,可以捕获异常并返回等待循环。这在选项1中是不可能的。选项1的优点是,您不需要做很多工作就可以实现它。哦,不要在/tmp中为哨兵使用文件。把它放在安全的地方。非常感谢大家!我会花一段时间来考虑这些解决方案!