34273


たとえば、rubyで

[code]

    system('start "" cmd')
    
[/code]

とすると、非同期で実行できますが、プロセスIDが取得できないので、強制終了できません。

[code]

    i = Process.spawn("cmd")
    
[/code]

とするとプロセスIDは取得できますが、`Process.kill("TERM", i)` で終了できません。

目下のところは、spawn() でidを取得し、`taskkill /im #{pid} /f /t` で強制終了しています。

rubyで`cmd`のプロセスIDを取得でき、かつ、強制終了する方法はありますか？


CC BY-SA 3.0
2017-04-25T04:43:19.010
34258
2020-05-14T05:33:15.883
2017-04-25T07:24:09.030
76
18863
question
ruby windows
rubyで非同期に実行した外部プログラムのプロセスIDを取得し、強制終了させたい。


Windowsの場合 `taskkill` で停止するのが良いようです。  
[How to kill processes on Windows using Ruby |
Simplificator](https://blog.simplificator.com/2016/01/18/how-to-kill-
processes-on-windows-using-ruby/)


CC BY-SA 3.0
2017-04-25T13:43:46.457
34273
2017-04-25T13:43:46.457
5008
34258
answer


強制終了するのにプロセスIDは使用していませんが・・・

[code]

    require "win32ole"
    
    def kill_process(exe_file)
      wmi = WIN32OLE.connect('winmgmts://')
      res = wmi.ExecQuery("select * from Win32_Process where CommandLine like '%#{exe_file}%'")
      res.each do |item|
        p item.ProcessID
        item.terminate
      end
    end
    
    kill_process("xxxxxx.exe")
    
[/code]


CC BY-SA 4.0
2020-05-14T05:28:33.523
66590
2020-05-14T05:33:15.883
2020-05-14T05:33:15.883
40141
40141
34258
answer