Ruby生成一个对象方法
我试图找出一种方法来跟踪我创建的流程的状态。在脚本中,我首先创建对象: ov=OpenVASOMP::OpenVASOMP.new({“主机”=>“本地主机”、“端口”=>“9390”、“用户”=>“管理员”、“密码”=>“#{ENV[“ov”]}”) 它创建了一个Ruby生成一个对象方法,ruby,Ruby,我试图找出一种方法来跟踪我创建的流程的状态。在脚本中,我首先创建对象: ov=OpenVASOMP::OpenVASOMP.new({“主机”=>“本地主机”、“端口”=>“9390”、“用户”=>“管理员”、“密码”=>“#{ENV[“ov”]}”) 它创建了一个ov对象,并公开了一系列其他方法。特别是:ov.task\u start 我需要能够在进程运行时跟踪进程并执行其他操作,例如向远程服务器发送状态更新 我最初的想法是将其包装在一个过程中。生成并跟踪PID,但这会引发一个错误: Typ
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)}
对你有用。好的,重构一些代码,我会让你知道的@马克斯普莱纳工作得很有魅力!