gpt4 book ai didi

powershell - Linux PowerShell 中的 'nohup' 是什么?

转载 作者:行者123 更新时间:2023-12-03 01:24:32 40 4
gpt4 key购买 nike

我很清楚 duplicate question 的存在.但是这个问题被标记为已回答,我认为它根本没有回答原始问题。

即使 nohup 的父进程(shell)死了,$ nohup 命令 仍继续执行命令。更多信息在这里:What's the difference between nohup and ampersand .

对于 Win32 api,我看到行 When the system is terminating a process, it does not terminate any child processes that the process has created. Terminating a process does not generate notifications for WH_CBT hook procedures. .这是我要问的理想行为。这会自动与 win32 powershell 一起工作。但是对于 linux powershell 的 Start-Job 它只是 powershell 上下文中的后台作业,因为它在 powershell 被杀死时被杀死。

例子:

➜  ~ powershell-preview -c "Start-Job { /bin/sleep 1000 }"

Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 BackgroundJob Running True localhost /bin/sleep 1000

➜ ~ ps ux | grep sleep
mvaidya 166986 0.0 0.0 9032 664 pts/11 S+ 18:59 0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep

最佳答案

使用 Start-Job或 PowerShell v6+ 的 & background operator不是一个选项,因为终止作业也会终止从它启动的子进程,这些作业是 - 在 Windows 和类 Unix 平台上

但是,您可以通过 Start-Process 实现类似 nohup 的行为命令:


Unix 类平台上,您可以将 Start-Processnohup 结合使用:
以下示例启动一个后台 PowerShell 实例,即使在您关闭启动终端后该实例仍保持事件状态;它每秒发出一个 .,并且 nohup 在当前目录的文件 nohup.out 中收集 stdout 和 stderr 输出,附加到这样一个文件如果已经存在:

# Runs for 2 minutes and appends both stdout and stderr output to ./nohup.out
Start-Process nohup 'pwsh -nop -c "1..120 | % { write-host . -nonewline; sleep 1 }"'

警告:从 PowerShell 7.2 开始,通过 SSH 连接运行此命令仅在通过ssh<启动连接时有效,而不是通过 PowerShell 自己的基于 SSH 的远程处理 cmdlet,例如 Invoke-CommandEnter-PSSession [1].

例如 - 假设用户在目标计算机上的默认 shell 是 pwsh (PowerShell),可以使用以下命令;请注意,选项 -t 是必需的,以便分配伪终端 (pty),以便 nohup 认为其标准输出已连接到终端因此将其输出发送到文件 .\nohup.out):

ssh -t <user>@<host> 'Start-Process nohup ''pwsh -nop -c \"1..120 | % { write-host . -nonewline; sleep 1 }\"'''

请注意对 \" 而不仅仅是 " 的惊人需求,这是为了补偿 PowerShell 从 PowerShell 7.1 开始向外部程序传递参数的问题- 参见 this answer .

相比之下,如果用户在目标计算机上的默认 shell 是 POSIX 兼容 shell,例如 bash,请使用以下 (从 PowerShell 运行):

# IMPORTANT: If the target machine runs macOS rather than Linux, use the
# `pwsh`'s *full path*, which is `/usr/local/bin/pwsh` by default.
ssh -t <user>@<host> 'nohup pwsh -nop -c ''1..120 | % { write-host . -nonewline; sleep 1 }'' & whoami >/dev/null'

请注意在提交后台作业 ( &) 后使用虚拟命令 whoami >/dev/null,这似乎是确保 nohup 获得足够的时间来实际启动其目标命令。


Windows 上,Start-Process 默认情况下会在新的控制台窗口中创建一个独立的进程,您可以使用 - WindowStyle Hidden 在隐藏窗口中启动该进程,该窗口将独立于启动 shell 而保持事件状态。

# Runs for 2 minutes and appends success output to ./nohup.out
Start-Process -WindowStyle Hidden pwsh '-nop -c "1..120 | % { Add-Content -nonewline nohup.out -Value .; sleep 1 }"'

警告:这不能按原样工作远程处理:

  • 在远程 session 中,Start-Process 无法以这种方式在单独(隐藏)窗口中启动进程,因此退出远程 session 时,启动的进程终止为好吧

  • 但是,您可以创建一个断开连接的 session ,该 session 在目标计算机上保持事件状态,直到它被明确删除(或直到目标计算机重新启动);或者,显式创建常规(已连接) session 并根据需要保留它 - 尽管如果调用计算机在任务完成之前重新启动,任务将再次终止(除非您先明确断开 session )。

一个例子,使用Invoke-Command-InDisconnectedSession 开关:

# Launch the command remotely, in a disconnected session, and
# return a session-information object:
$disconnSess = Invoke-Command -Computer <host> -InDisconnectedSession {
Start-Process -WindowStyle Hidden pwsh '-nop -c "1..120 | % { Add-Content -nonewline nohup.out -Value .; sleep 1 }"'
}

# ... Let the command finish

# Remove the session again
Remove-PSSession $disconnSess

[1] 这些 cmdlet 不分配伪终端 (pty),缺少伪终端会导致 nohup 将其输出打印到 stdout 和 stderr,而不是文件 。\nohup.out。此外,这种意外的直接打印输出可能导致远程 PowerShell session 崩溃

关于powershell - Linux PowerShell 中的 'nohup' 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64707869/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com