Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 按名称查找进程ID_Ruby_Unix - Fatal编程技术网

Ruby 按名称查找进程ID

Ruby 按名称查找进程ID,ruby,unix,Ruby,Unix,如何在Ruby中按名称或完整命令行查找pid,而不调用外部可执行文件 我将SIGUSR2发送到一个进程,该进程的命令行包含ruby job.rb。我想在不调用pgrep的情况下执行以下操作: uid = Process.uid pid = `pgrep -f "ruby job.rb" -u #{uid}`.split("\n").first.to_i Process.kill "USR2", pid 如何做到这一点取决于您的操作系统。假设使用Linux,您可以手动爬网/proc文件系统并查找

如何在Ruby中按名称或完整命令行查找pid,而不调用外部可执行文件

我将SIGUSR2发送到一个进程,该进程的命令行包含
ruby job.rb
。我想在不调用
pgrep
的情况下执行以下操作:

uid = Process.uid
pid = `pgrep -f "ruby job.rb" -u #{uid}`.split("\n").first.to_i
Process.kill "USR2", pid

如何做到这一点取决于您的操作系统。假设使用Linux,您可以手动爬网/proc文件系统并查找正确的命令行。然而,这与pgrep所做的是一样的,实际上会降低程序的可移植性

像这样的东西可能有用

def get_pid(cmd)
  Dir['/proc/[0-9]*/cmdline'].each do|p|
    if File.read(p) == cmd
      Process.kill( "USR2", p.split('/')[1] )
    end
  end
end

只需小心地在/proc中搜索。

一个快速的谷歌搜索出现了,它应该可以让你以一种便携的方式进行搜索


免责声明:我不使用Ruby,无法确认这是否有效。

基于Debian的系统使用pidof命令查找pid

一些使用ruby的kill进程函数:

def killPid(cmd)
   pid=exec("pidof #{cmd}")
   Process.kill "USR2", pid
end

说到可移植性较差—这在Solaris上不起作用。你在这里假设你是在Linux上运行的。是的,我说过“假设Linux。”+1接受了另一个答案,但我也喜欢这个。如果您使用不同的参数pidof运行同一命令的多个实例,那么提醒您在Linux上使用任何语言仅使用文件系统可以做多少事情是没有帮助的,这可能是危险的,具体取决于参数的来源。您正在将字符串插入到命令中。该字符串很可能是
测试;rm-rf/var/www/
。可以在多个参数中接受类似的内容,因此
exec('pidof',cmd)
会更安全。这并不能回答问题,但如果我们已经在进行外部系统调用,我们也可以在那里终止进程。例如,
`pgrep-f'some job'| xargs kill`