我有一台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
,我应该使用确切的命令:当然,如果您的 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
使用这将返回此结构的输出:
当然 using
|Select-Object -ExpandProperty (_your_property_here_)
将显示所有可用的Methods
,例如Create
我们在上面的命令中使用的,以及所有可用的Properties
(我们没有使用)。