2017-05-23 10 views
0

私が作成したプロセスの状態を追跡する方法を見つけようとしています。私のスクリプトでは、オブジェクトを作成することから始めます: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 

は、私はすべてが間違っているこれについてつもり?

+0

それは不明だ何 '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で子プロセスを生成する)) –

+0

@maxpleaner質問を 'task_start'の内容で更新しました。私は今までプロセス制御のルビ関数を実際に使っていません。 'fork 'は私が必要とするPIDを追跡できるのですか? – Godzilla74

+0

です。私はちょうど確認し、Process.forkから返されたPIDは 'kill -9'に渡して止めることができます。だから多分 'pid = Process.fork {ov.task_start(taskid)}'を使ってあなたのために働くでしょう。 –

答えて

0

答えの中のコメントで私が言ったことをちょうど繰り返す。

task_startはシェルスクリプト文字列ではなく、非同期で実行する必要があるコードブロックのため、Process.spawnの代わりにProcess.fork { ov.task_start taskid }を使用してください。

# 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. 
関連する問題