私はWindows サーバー 2016CLIを使用するファイルをリモートで実行する必要があるマシンSSHを使用する。
SSH 接続からログアウトすると、ssh ユーザーによって開始されたプロセスが終了することが知られています。Linux マシンでは、nohup
またはなどのソリューションを使用できます。screen
その結果、ログオフしてもプロセスが強制終了されなくなります。
ただし、このようなソリューションは Windows マシンでは機能しないため、ログアウト後にプロセスが終了しないようにする方法を探しています。
- 私のクライアントはUbuntuマシン
- 私のWindows Server 2016はオープンSHH、 とパワーシェルデフォルトのシェルとして
- 私のプログラムはデーモンモードで動作するように設定されており、cmdやpowershellウィンドウは開いたままになっていません
- を使用すると、
Get-Process -Name proc_name
プロセスが実際に実行されていることがわかります Get-Process
SSHログアウト後に使用すると、そのようなプロセスは発生しません。
私が試したこと:
.exe
を使用してファイルを実行しますcmd
。.bat
および.ps
ファイルを実行しており、.exe
その引数を使用して を起動します。
Windows マシンでこの問題に対処する方法はありますか?
答え1
解決策を探すのに多くの時間を費やした後、PowerShell を使用してこれを行う絶対的に正しい方法を見つけました。
これは、オンラインであまり使用されていない、またはドキュメント化されていないコマンドレットの 1 つであるように思われ、の広大な世界にすでに非常に精通していない限り、MSDN ドキュメントを使用して独自に理解することはほぼ不可能ですWmi Objects
。
要するに:
foo.exe
引数 、 、 を使用してバックグラウンドで実行する必要があるプログラムがあると仮定すると、-a
正確なコマンドを使用する必要があります。-b
bar
Invoke-WmiMethod -Path 'Win32_Process' -Name Create -ArgumentList 'C:\Users\foo\Desktop\foo.exe -a -b bar'
もちろん、exe が「既知の」exe (notepad や ping などのデフォルト) であるか、自分で追加した場合は、-ArgumentList
exe 名 (notepad、ping など) を使用するときにフル パスは必要ありません。
追加パラメータ:
Invoke-WmiMethod
、 ( SSHを使用せずにリモートマシン上の何かにローカルPSを使用する良い方法)、などの追加パラメータをサポートしています-Credential
。 -ComputerName
Invoke
-Impersonation
詳細はこちら。
コマンドレット構文の説明と追加のコマンドレット ツール:
- 議論は名前
-Path
に向けられてWmiObject
いる。数十のWmiObjects
、それぞれに多数のMethods
およびがありますProperties
。 - 引数
-Name
は使用される を指示しますMethod
。 Wmi-Objects
使用可能なすべてのものを一覧表示するにはGet-WmiObject -List
(この方法では必要なオブジェクトを見つけるのが非常に困難です)。- 利用可能なすべてのもの
Win32_Process
Methods
を一覧表示して表示するにはProperties
Get-WmiObject -List |where{$_.name -match '^Win32_Process$'}
これにより、次の構造の出力が返されます。
NameSpace: ROOT\cimv2
Name Methods Properties
---- ------- ----------
Win32_Process {Create, Terminat... {Caption, CommandLine, CreationClassName, CreationDate...}
もちろん、を使用すると、上記のコマンドで使用したすべての使用可能なもの、および使用しなかったすべての使用可能なもの|Select-Object -ExpandProperty (_your_property_here_)
が表示されます。Methods
Create
Properties