Linux
在 Windows 伺服器上 SSH 註銷後程序終止
我有一台Windows server 2016機器,它需要執行一個使用 cli 的文件,遠端使用 SSH。
眾所周知,註銷 SSH 連接會終止由 ssh 使用者啟動的程序。在 linux 機器上,可以使用
nohup
or之類的解決方案screen
,從而導致程序在註銷後不會被殺死。不過,此類解決方案不適用於 Windows 機器,我正在尋找一種方法來防止程序在註銷後終止。
- 我的客戶是一台 Ubuntu 機器
- 我的 Windows server 2016 執行OpenSHH,使用PowerShell作為預設 shell
- 我的程序設置為在守護程序模式下工作,並且沒有打開任何 cmd 或 powershell 視窗
- 使用
Get-Process -Name proc_name
顯示該程序確實正在執行- 在 SSH 註銷後使用
Get-Process
不會產生這樣的過程我也嘗試過的事情:
- 使用.
.exe
_cmd
- 執行以參數開頭的
.bat
和.ps
文件.exe
。有沒有辦法在 Windows 機器上解決這個問題?
在花了很多時間尋找解決方案之後,我找到了使用 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
, (在不使用 SSH 的情況下使用-ComputerName
本地 PS 連接到遠端機器上的東西的好方法),還有更多文件在這裡。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...}
當然 using
|Select-Object -ExpandProperty (_your_property_here_)
將顯示所有可用的Methods
,例如Create
我們在上面的命令中使用的,以及所有可用的Properties
(我們沒有使用)。