【问题标题】:Locking a file to verify a single execution of a service. How reliable?锁定文件以验证服务的单次执行。有多可靠?
【发布时间】:2011-02-16 00:38:39
【问题描述】:

我正在向 UNIX(AIX) 系统部署一个小服务。我想检查启动它时是否没有运行该服务的活动实例。 这样实施检查的可靠性如何?

  1. 尝试获取文件的锁定(w/FileChannel
  2. 如果成功,保持锁定并继续执行
  3. 如果失败,退出并拒绝运行主体

我知道像 Tanuki 包装器这样的软件,但是,我渴望一个更简单(也许不是便携式)的解决方案。


编辑:关于 PIDFILE(s):如果可能,我想避免使用它们,因为我没有机器上的管理权限,也没有 AIX 的 shell 编程知识。

【问题讨论】:

    标签: java file service locking daemon


    【解决方案1】:

    另一种方法是使用ServerSocket 绑定到服务器上的特定端口,如果该端口正在使用中,那么您的服务已经在运行:

    int port = 12345;
    
    try { 
        java.net.ServerSocket ss = new java.net.ServerSocket(port); 
    } catch (java.net.BindException ex) { 
        System.err.println("service is already running and bound to port "+port);
        System.exit(1);
    } 
    

    这种方法的优点是它几乎可以在任何平台上很好地工作。

    【讨论】:

    • @nineside 如果该系统上的任何其他服务或应用程序也使用相同的端口并且在 OP 尝试运行他的服务时正在运行怎么办?
    • 如果您有其他服务绑定到服务器上运行的端口,我希望您知道它们是什么并避免使用这些端口号。一些服务绑定到随机空闲端口,但它们几乎总是从定义的范围内选择该数字。我非常怀疑在大多数现实世界的情况下你会用完端口。
    • 我已经结束了使用它。确实不错的方法!
    【解决方案2】:

    传统上,在 Unix 系统上,这是通过创建文件 /var/run/nameofservice.pid 来完成的。启动时检查是否存在这样的文件,如果不存在,则创建它并继续。然后当服务关闭时,pid文件被删除。

    顾名思义,这个文件的内容就是服务的PID。这允许某种形式的错误恢复,因为当服务启动并检测到存在 PID 文件时,它可以检查具有该 PID 的进程是否确实存在,如果不存在,这意味着服务守护进程已经崩溃,开始并尝试从之前的崩溃中恢复。

    【讨论】:

    • 嗯,这对于任何本机程序来说当然很酷,但不是 java - 无法访问当前进程的 PID,无法检查某些 PID 是否处于活动状态等等......
    【解决方案3】:

    为什么不使用 pidfile ? http://www.linux.com/archive/feed/46892

    检查文件是否存在。如果是这样,请警告用户并立即退出。否则创建该文件并继续运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多