我正在使用 Windows 机器作为 ssh 服务器。我想远程运行一些需要几个小时才能完成的任务。有没有办法在 Powershell 中远程 ssh 会话断开后仍能保持进程持续?
答案1
经过一些实验,现在我已经用 PowerShell Remoting 替换了 ssh。
特别是,启动一个远程作业,将结果保存在远程计算机上关于远程工作非常有帮助。
基本上我目前的工作流程是
- 打开新的 PSSession
Invoke-Command
在远程服务器上以作业形式调用命令 ( ),使用Start-Job
然后我可以自由地断开会话连接,然后重新连接到会话并获取作业输出Receive-Job
。
答案2
通过 PSSession 使用 RunasJob 参数:
(摘自关于远程作业的帮助)
启动远程作业并将结果返回到本地计算机 (ASJOB)
要在远程计算机上启动将命令结果返回本地计算机的后台作业,请使用 cmdlet(例如 Invoke-Command cmdlet)的 AsJob 参数。
使用 AsJob 参数时,即使作业在远程计算机上运行,作业对象实际上也是在本地计算机上创建的。作业完成后,结果将返回到本地计算机。
您可以使用包含 Job 名词的 cmdlet(Job cmdlet)来管理由任何 cmdlet 创建的任何作业。许多具有 AsJob 参数的 cmdlet 不使用 Windows PowerShell 远程处理,因此即使在未配置 远程处理且不符合远程处理要求的
计算机上也可以使用它们。步骤 1:调用命令 -ASJOB
以下命令使用 Invoke-Command 的 AsJob 参数在 Server01 计算机上启动后台作业。该作业运行 Get-Eventlog 命令,该命令获取系统日志中的事件。您可以使用 JobName 参数为该作业分配显示名称。
invoke-command -computername Server01 -scriptblock {get-eventlog system} -asjob
该命令的结果类似于以下示例输出。
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 get-eventlog system
使用 AsJob 参数时,Invoke-Command 返回的作业对象类型与 Start-Job 返回的作业对象类型相同。您可以将作业对象保存在变量中,也可以使用 Get-Job 命令获取作业。
请注意,Location 属性的值显示该作业在 Server01 计算机上运行。
第二步:找到工作
若要管理使用 Invoke-Command cmdlet 的 AsJob 参数启动的作业,请使用 Job cmdlet。由于代表远程作业的作业对象位于本地计算机上,因此您无需运行远程命令来管理作业。
要确定作业是否完成,请使用 Get-Job 命令。以下命令获取当前会话中启动的所有作业。
get-job
由于远程作业是在当前会话中启动的,因此本地 Get-Job 命令获取该作业。作业对象的 State 属性显示该命令已成功完成。
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 get-eventlog system
步骤 3:接收工作
要获取作业的结果,请使用 Receive-Job cmdlet。由于作业结果会自动返回到作业对象所在的计算机,因此您可以使用本地 Receive-Job 命令获取结果。
以下命令使用 Receive-Job cmdlet 获取作业结果。它使用会话 ID 来标识作业。此命令将作业结果保存在 $results 变量中。您还可以将结果重定向到文件。
$results = receive-job -id 1
答案3
您正在寻找的是 PSSessions。
来自 technet 上的 about_pssessions 页面(http://technet.microsoft.com/en-us/library/hh847839.aspx)
但是,与自动启动的会话不同,您可以控制自己创建的 PSSession。您可以获取、创建、配置和删除它们,断开连接并重新连接它们,以及在同一个 PSSession 中运行多个命令。PSSession 一直可用,直到您将其删除或超时。
答案4
由于 OP 使用 ssh 从非 Windows 计算机连接到 Powershell,因此他无法使用 Powershell 会话。他会像连接到本地计算机一样运行它。Start-Job cmdlet 应该可以解决问题:
Start-Job -scriptblock {您希望作为作业运行的脚本或命令}