我有一個Windows 伺服器 2016需要遠端執行使用 cli 的檔案的機器使用SSH。
眾所周知,登出 SSH 連線會終止 ssh 使用者啟動的進程。在 Linux 機器上,可以使用諸如nohup
或 之類的解決方案screen
,導致進程在登出後不會被終止。
不過,此類解決方案不適用於 Windows 計算機,我正在尋找一種方法來防止進程在登出後終止。
- 我的客戶是一個Ubuntu機器
- 我的 Windows Server 2016 運行開放式SHH, 和電源外殼作為預設 shell
- 我的程式設定為在守護程式模式下工作,並且沒有 cmd 或 powershell 視窗保持開啟狀態
- 使用
Get-Process -Name proc_name
顯示進程確實正在運行 Get-Process
SSH 註銷後使用不會產生這樣的過程
我也嘗試過的事情:
- 使用運行該
.exe
檔案cmd
。 - 運行 a
.bat
和文件,以參數.ps
開始。.exe
有沒有辦法在Windows機器上解決這個問題?
答案1
在花費大量時間尋找解決方案後,我找到了使用 PowerShell 執行此操作的絕對正確方法。
它似乎是在線使用或記錄較少的 cmdlet 之一,並且幾乎不可能使用 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(預設情況下,例如記事本或 ping)或由您添加,則在使用時不需要完整路徑,-ArgumentList
並且exe 名稱就足夠了(記事本、ping 等) 。
附加參數:
Invoke-WmiMethod
支援附加參數,例如-Credential
, (一種在遠端電腦上-ComputerName
使用本機 PS 而不使用 SSH 的好方法),以及許多Invoke
-Impersonation
更多記錄在這裡。
Cmdlet 語法說明和其他 cmdlet 工具:
- 論證
-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
(我們沒有使用)。