我有一个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
命令可能有问题,但我不知道它是什么。
答案 0 :(得分:1)
我会使用Ruby脚本来运行所有内容。
您可以让您的Ruby脚本使用process_files.rb
启动process_client.rb
和Process.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
指定值的行中,您的意思是使用反引号而不是双引号吗?