找出当前是否正在运行ruby脚本

时间:2018-02-16 16:53:43

标签: ruby grep find

我有一个ruby脚本,每分钟都被一个名为'process_files.rb'的CRON作业触发。

process_files.rb执行另一个名为“process_client.rb”的ruby脚本,其中包含如下参数:

ruby process_client.rb -c ABC -s 123 -f /path/to/client/file/client_file

由于process_files.rb每分钟运行一次,我想避免运行process_client.rb,如果它的版本当前使用相同的-c参数运行的话。因此,如果process_client.rb当前正在为-c ABC运行,则不会 执行上面的ruby命令。

两个脚本都在名为/ cdir的同一目录中。

这就是我在process_files.rb中所得到的,但它不起作用:

client = "ABC"
name = "process_client.rb -c #{client}"
needle = `find /cdir -maxdepth 1 -type f -name #{name}`.to_i
if needle > 0
   puts "DONT RUN the ruby script for client abc"
else
   puts "RUN the ruby script for client abc"
   ruby process_client.rb -c ABC -s 123 -f /path/to/client/file/client_file
end

然后在执行process.files.rb之前,我为客户端ABC执行process_client.rb,它有一些代码使其进入睡眠模式30秒,如下所示:

...some code
sleep 30
...some code

问题是process_files.rb永远不会找到客户端ABC的process_client.rb的当前执行,并且当它不应该执行时执行另一个版本。

find命令可能有问题,但我不知道它是什么。

2 个答案:

答案 0 :(得分:1)

我会使用Ruby脚本来运行所有内容。

您可以让您的Ruby脚本使用process_files.rb启动process_client.rbProcess.spawn,您可以获取进程PID以了解它们是否正在运行。

很明显,您需要修改下面的代码以满足您的需求,但这应该可以让您入门。

def process_client(client)
  client_pid = Process.spawn('/usr/bin/ruby', 'process_client.rb', '-c', client)
  Process.detach(client_pid)
  client_pid
end

def process_files(some_arg)
  # do some stuff
end

process_client_pid = process_client('ABC')

loop do
  begin
    Process.getpgid(process_client_pid)
    # This means the process_client.rb script is running
  rescue Errno::ESRCH
    # Code here for when the client is not being processed
    process_client_pid = process_client('ABC')
    process_files(some_arg)

  sleep 30
end

答案 1 :(得分:0)

我认为您的问题是您使用了错误的策略来检测来自find的匹配项。它将返回由新行分隔的filespecs(可能为空)列表。在该列表上调用to_i没有意义。您可以改为将其管道到字数以获取行数,并将 转换为int:

`find ... | wc -l`.to_i

此外,在为name指定值的行中,您的意思是使用反引号而不是双引号吗?