私が作成したプロセスの状態を追跡する方法を見つけようとしています。私のスクリプトでは、オブジェクトを作成することから始めます:Rubyがオブジェクトメソッドを生成する
ov = OpenVASOMP :: OpenVASOMP.new({"host" => "localhost"、 "port" => "9390"、 "user" => "admin
ov
オブジェクトが作成され、他の方法が多数公開されています。「パスワード」=>「#{ENV ["OV"]}特に:ov.task_start
。
ステータス更新をリモートサーバーに送信するなど、実行中にプロセスを追跡して他のアクションを実行できるようにする必要があります。
私の最初の考えはProcess.spawn
でこれをラップし、PIDを追跡するためだったが、それはエラーを投げています:この行に
TypeError: no implicit conversion of REXML::Element into String
とスタックトレースポイントを:pid = Process.spawn(ov.task_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
そしてtask_start
は、次のようになります:
ここでは、コードの私の全体のブロックは、私が欠けている何か他のものがある場合にだ
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
は、私はすべてが間違っているこれについてつもり?
それは不明だ何 'ov.task_start(のtaskId)'を返します:
Process.fork
コールには、例えば、プロセスを停止するために使用することができPIDを返します。 [Process.spawn](https://ruby-doc.org/core-2.2.0/Process.html#method-c-spawn)は、シェルコマンド(文字列)を引数として取ります。任意のブロックを受け入れるProcess.forkもあります([how-do-you-spawn-a-child-process-in-ruby](https://stackoverflow.com/questions/307070/how-do-you- Rubyで子プロセスを生成する)) –@maxpleaner質問を 'task_start'の内容で更新しました。私は今までプロセス制御のルビ関数を実際に使っていません。 'fork 'は私が必要とするPIDを追跡できるのですか? – Godzilla74
です。私はちょうど確認し、Process.forkから返されたPIDは 'kill -9'に渡して止めることができます。だから多分 'pid = Process.fork {ov.task_start(taskid)}'を使ってあなたのために働くでしょう。 –