You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测同名-c参数的Ruby脚本process_client.rb运行状态并避免重复执行

嘿,针对你遇到的这个「避免同-c参数的process_client.rb重复执行」的需求,我给你整理了两个实用的解决方案,都是Ruby生态里常用的思路:

方案一:基于锁文件的进程互斥(推荐)

这个方法的核心是给每个-c参数对应的实例生成唯一的锁文件,脚本启动时先检查锁文件是否存在且对应进程存活,只有当锁无效时才继续执行。好处是逻辑清晰,不容易误判,而且能处理子脚本异常退出的情况。

你只需要在/cdir/process_client.rb的开头添加以下代码:

require 'fileutils'

# 提取-c参数的值
client_id = ARGV.each_with_index do |arg, idx|
  break ARGV[idx + 1] if arg == '-c'
end
raise "Missing required -c parameter" unless client_id

# 生成唯一锁文件路径,用/tmp目录存储
lock_file = "/tmp/process_client_#{client_id}.lock"

# 检查锁文件状态:如果存在,验证对应进程是否还在运行
if File.exist?(lock_file)
  existing_pid = File.read(lock_file).strip.to_i
  # 用kill(0)检查进程是否存活(不会发送实际信号)
  if Process.kill(0, existing_pid) rescue false
    puts "⚠️  Client #{client_id} is already running (PID: #{existing_pid}), exiting."
    exit 0
  else
    # 锁文件存在但进程已死,清理旧锁
    FileUtils.rm_f(lock_file)
    puts "🗑️  Cleaned up stale lock file for client #{client_id}"
  end
end

# 创建新锁文件并写入当前PID
File.write(lock_file, Process.pid.to_s)
# 确保脚本正常/异常退出时都删除锁文件
at_exit { FileUtils.rm_f(lock_file) if File.exist?(lock_file) }

# --- 下面是原process_client.rb的业务逻辑 ---
方案二:通过系统进程列表检查(无需修改子脚本)

如果你不想改动process_client.rb,可以在调用它的process_files.rb里先检查系统中是否存在对应参数的运行实例。这个方法依赖系统的进程查询命令,比如pgrep。

在/cdir/process_files.rb中,每次准备调用process_client.rb前,加入以下检查逻辑:

# 假设这里你要调用的-c参数值是client_id(替换成实际变量)
client_id = "ABC"

# 构造精确匹配的进程查询命令,避免误匹配其他脚本
# 注意:如果client_id包含特殊字符,需要用Shellwords.escape转义
require 'shellwords'
escaped_client_id = Shellwords.escape(client_id)
check_cmd = "pgrep -f 'ruby /cdir/process_client.rb -c #{escaped_client_id}'"

# 执行查询并判断结果
existing_pids = `#{check_cmd}`.strip
unless existing_pids.empty?
  puts "⚠️  Skipping client #{client_id}: already running with PID(s) #{existing_pids}"
else
  # 没有对应进程,执行子脚本
  system("ruby /cdir/process_client.rb -c #{client_id}")
end

两种方案的对比

  • 锁文件方案:更可靠,不受进程名/参数模糊匹配的影响;能处理子脚本意外崩溃后遗留的锁文件;但需要修改子脚本。
  • 进程查询方案:无需改动子脚本,实现简单;但依赖系统的pgrep命令(不同系统可能有差异,比如macOS的pgrep需要加-x精确匹配),且如果参数包含特殊字符需要额外转义,容易出现误判。

额外注意事项

  1. 锁文件尽量放在全局可写的临时目录(比如/tmp),但要注意不同用户的权限问题,如果你的CRON是用特定用户运行的,确保该用户有读写权限。
  2. 如果你用锁文件方案,建议定期清理/tmp目录下的旧锁文件(比如通过CRON每周清理一次),避免极端情况下的残留。
  3. 进程查询方案中,一定要用精确匹配的命令,比如完整的脚本路径和参数,否则可能会误判其他包含相同参数的进程。

内容的提问来源于stack exchange,提问作者kewpe20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:41:48