tl;dr
下記のコマンドの<YourCommands>
を書き換えれば良い.
Invoke-Wmimethod -Class Win32_Process -Name Create -ArgumentList "powershell <YourCommands>"
背景
普段UNIX系のOSを使っているが,ひょんなことからWindowsにSSHで入ったときにnohupしたくなったら,意外と情報がなくて困ったので備忘録として書くことにした.
例えばJupyterとかを起動しっぱなしにしたい時に,SSHから起動するとBroken PipeしたときにJupyterごと落ちてしまう.
別プロセスで実行するコマンドとしてStart-Process
がある.下記のように表記する.
$proc=Start-Process -FilePath 'Powershell.exe' -ArgumentList 'jupyter' -PassThru
しかし,この方法も別プロセスでプログラムは走るが,SSHから切断した瞬間にプロセスが落とされてしまった.
そこで,冒頭の方法に辿り着いた.
Invoke-WmiMethodでプロセスを起動する
下記の方法だとSSHの接続が切れてもプロセスは残り続けるので,Linuxでいうところのnohup
が実現できる.
Invoke-Wmimethod -Class Win32_Process -Name Create -ArgumentList "powershell <YourCommands>"
実行すると次のような出力が返ってくるので,ProcessIdを控えておく.
__GENUS : 2
__SUPERCLASS :
__DYNASTY : __PARAMETERS
__RELPATH :
__PROPERTY_COUNT : 2
__DERIVATION : {}
__SERVER :
__NAMESPACE :
__PATH :
ProcessId : 8876
ReturnValue : 0
PSComputerName :
プロセスが動作中かどうかは,Get-Process
で確認すればよい.
Get-Process powershell
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
430 23 52372 55844 0.16 8684 0 powershell
719 36 60984 65756 5.31 8876 0 powershell
757 30 62512 74656 0.75 13060 0 powershell
先ほど実行したpowershellのProcessIdが実行されていることがわかる.
プロセスを落としたい場合はStop-Process
でいける.
Stop-Process -ID "<ProcessId>"