我有一个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
。- 运行
.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
, (这是使用本地 PS 来操作远程机器而不使用 SSH 的-ComputerName
好方法),以及许多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
(我们没有使用)。