Ruby生成一个对象方法

Ruby生成一个对象方法,ruby,Ruby,我试图找出一种方法来跟踪我创建的流程的状态。在脚本中,我首先创建对象: ov=OpenVASOMP::OpenVASOMP.new({“主机”=>“本地主机”、“端口”=>“9390”、“用户”=>“管理员”、“密码”=>“#{ENV[“ov”]}”) 它创建了一个ov对象,并公开了一系列其他方法。特别是:ov.task\u start 我需要能够在进程运行时跟踪进程并执行其他操作,例如向远程服务器发送状态更新 我最初的想法是将其包装在一个过程中。生成并跟踪PID,但这会引发一个错误: Typ

我试图找出一种方法来跟踪我创建的流程的状态。在脚本中,我首先创建对象:

ov=OpenVASOMP::OpenVASOMP.new({“主机”=>“本地主机”、“端口”=>“9390”、“用户”=>“管理员”、“密码”=>“#{ENV[“ov”]}”)

它创建了一个
ov
对象,并公开了一系列其他方法。特别是:
ov.task\u start

我需要能够在进程运行时跟踪进程并执行其他操作,例如向远程服务器发送状态更新

我最初的想法是将其包装在一个
过程中。生成
并跟踪PID,但这会引发一个错误:

 TypeError: no implicit conversion of REXML::Element into String
堆栈跟踪指向这一行:
pid=Process.spawn(ov.task\u start(taskid))

所以,我猜您不能将对象及其方法传递到
spawn

这是我的全部代码块,以防我遗漏了其他东西:

ov = OpenVASOMP::OpenVASOMP.new({"host" => "localhost", "port" => "9390", "user" => "admin", "password" => "#{ENV["OV"]}"})
taskid = ov.task_create({"name" => timestamp, "target" => target, "config" => config})
running = true
pid = Process.spawn(ov.task_start(taskid))
Signal.trap("HUP") { log("#{results_dir}/events.log", "[!] Stop triggered by user!"); exit }
until running == false
  begin
    running = Process.getpgid(pid)
    log("#{results_dir}/events.log", "Scan PID: #{pid}")
    stat = ov.task_get_byid(taskid)
    update_ov_status(stat['progress'])
    log("#{results_dir}/events.log", "[+] Sending progress to server: #{stat['progress']}%")

    scan_status = get_scan_status

    if scan_status == "Stopped"
      ov.task_stop(taskid)
      ov.task_delete(taskid)
      ov.target_delete(target)
      Process.kill("HUP", pid)
      Process.wait
      update_task_id("")
      update_ov_status(0)
      update_scan_status("Idle")
    end

    sleep 60

  rescue Errno::ESRCH
    running = false
    puts "PID: #{pid} done!"
    log("#{results_dir}/events.log", "[!] Scan complete")
  end
end
而任务的开始看起来像:

    def task_start (task_id) 
        xmlreq=xml_attr("start_task",{"task_id" => task_id}).to_s()
        begin
            xr=omp_request_xml(xmlreq)
        rescue 
            raise OMPResponseError
        end
        return xr
    end

我这样做完全错了吗?

只是重复我在回复中所说的话,作为结束

由于
task\u start
不是shell脚本字符串,而是应该异步执行的代码块,因此请使用
Process.fork{ov.task\u start taskid}
而不是
Process.spawn

Process.fork
调用返回一个PID,可用于停止进程,例如:

# in one terminal
ruby -e "puts Process.fork { loop { puts('tick'); sleep 1 } }"
# it then prints a PID like 20626
# then in another terminal:
kill -9 20626
# the "tick" will stop getting printed every second.

只是重复我在回复中的评论,作为结束

由于
task\u start
不是shell脚本字符串,而是应该异步执行的代码块,因此请使用
Process.fork{ov.task\u start taskid}
而不是
Process.spawn

Process.fork
调用返回一个PID,可用于停止进程,例如:

# in one terminal
ruby -e "puts Process.fork { loop { puts('tick'); sleep 1 } }"
# it then prints a PID like 20626
# then in another terminal:
kill -9 20626
# the "tick" will stop getting printed every second.

尚不清楚
ov.task\u start(taskid)
返回什么。将shell命令(字符串)作为参数。还有Process.fork,它接受任意块(请参阅)@maxpleaner我用
task\u start
的内容更新了这个问题。到目前为止,我还没有真正使用过任何进程控制ruby函数。
fork
是否允许我根据需要跟踪PID?确实如此。我刚刚检查过,Process.fork返回的pid可以传递到
kill-9
来停止它。所以,也许使用
pid=Process.fork{ov.task\u start(taskid)}
对你有用。好的,重构一些代码,我会让你知道的@马克斯普莱纳工作得很有魅力!尚不清楚
ov.task\u start(taskid)
返回什么。将shell命令(字符串)作为参数。还有Process.fork,它接受任意块(请参阅)@maxpleaner我用
task\u start
的内容更新了这个问题。到目前为止,我还没有真正使用过任何进程控制ruby函数。
fork
是否允许我根据需要跟踪PID?确实如此。我刚刚检查过,Process.fork返回的pid可以传递到
kill-9
来停止它。所以,也许使用
pid=Process.fork{ov.task\u start(taskid)}
对你有用。好的,重构一些代码,我会让你知道的@马克斯普莱纳工作得很有魅力!