LoginSignup
6
0

More than 1 year has passed since last update.

Windows Powershellでnohupみたいなことをする

Posted at

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>"
6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0