AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1825353
Accepted
frans
frans
Asked: 2024-01-11 23:18:54 +0800 CST2024-01-11 23:18:54 +0800 CST 2024-01-11 23:18:54 +0800 CST

如何确保通过 ssh get 生成的进程随着连接而终止?

  • 772

ssh显然,即使连接消失,人们也会尝试保留通过运行启动的进程,请参阅https://duckduckgo.com/?q=ssh+process+still+active+after+connection+close

所以我相信进程通常会因连接而终止 - 直到今天。

随机地grep浏览ps我机器上的输出,我发现了几周前我使用的进程ssh,我想知道它们是如何到达那里的,现在我不知道如何不让进程保持活动状态(请参阅https://xkcd.com/2797)。

启动长时间运行的进程,例如htop,sleep或dmesg作为普通用户(但任何其他用户也可以),如下所示

ssh localhost sleep 123

活下去,直到我手动杀死他们。

pstree -spc $(pgrep -f "sleep 123")

当连接仍然存在时给我

systemd(1)───sshd(1299)───sshd(1887616)───sshd(1887654)───sleep(1887655)

但是在我终止 ssh 会话(使用 CTRL-C)后,相同的命令给了我

systemd(1)───sleep(1887655)

所以对我来说,它看起来像是sshd意识到连接已经消失,但不是终止关联的进程,而是将其移交给systemd。

即使其他人似乎都试图实现相反的目标,我如何确保终止ssh连接也会终止/杀死生成的进程?

注意:ssh localhost -t sleep 123以某种方式解决了我的问题,但在我看来,因为它改变了标准输入/标准输出的处理方式。我可以告诉ssh在连接关闭后不要移交进程吗?

linux
  • 1 1 个回答
  • 17 Views

1 个回答

  • Voted
  1. Best Answer
    u1686_grawity
    2024-01-11T23:33:10+08:002024-01-11T23:33:10+08:00

    所以对我来说,sshd 似乎意识到连接已经消失,但它没有终止相关进程,而是将其移交给 systemd。

    sshd 从一开始就不会真正终止进程。它所做的只是在您断开连接时退出,剩余的子进程会自动获取 PID 1 作为其新父进程;您期望的自动退出是由其他东西完成的。

    (此外,这并不是sshd 进行的显式切换——每当进程不再有父进程时,总会发生这种情况,并且这是自 UNIX 早期以来的标准行为。)

    如果您运行交互式SSH 连接(与 tty 关联的连接),则 sshd 退出将隐式“挂起”tty 设备,这会导致操作系统自动向所有将其作为控制 tty 的进程发送 SIGHUP。大多数程序将此信号视为它们应该退出的指示。因此,这个流行工具的名字就来了nohup——它只需忽略 SIGHUP 就可以使程序生存。(尽管“守护进程”经常将其误用为“重新加载”信号,因此不会退出。)

    当您 a) 不指定任何命令并进入交互式 shell,或 b) 指定命令和选项时,就会发生上述情况-t。

    然而,使用ssh直接命令(并且不使用-t)运行会禁用 tty 分配并用管道替换 stdin/stdout - 与 - 进行比较ssh myhost tty-ssh -t myhost tty并且管道不会执行“立即 SIGHUP”操作,这意味着没有任何内容会立即向进程发出信号退出,因此它们继续运行,操作系统只是在 PID 1 下重新设置它们的父级。当它们尝试向 stdout 写入内容并接收 SIGPIPE 时,它们最终可能会退出或被杀死(因为 stdout 管道的另一端已经被关闭),但他们可能不会。

    (管道在这种模式下使用是因为它们是“8 位干净”的,即从 0 到 255 的任何字节值都将不改变地通过,而 tty 设备通常执行额外的处理,这对于交互式使用很有用,但会损坏二进制数据。 )

    sshd 可以使用一些机制来使子进程终止(PDEATHSIG),但据我所知,它从未使用过这些机制。

    只有 systemd 才真正添加了杀死剩余进程的新机制。如果您KillUserSomething=在 /etc/systemd/logind.conf 中启用,它将导致 systemd 在会话结束时故意杀死所有内容(或者当用户不再有会话时;我不记得了)。有些发行版默认启用此功能,而其他发行版则不启用。

    systemd 机制通过 PAM“会话”机制工作,当 sshd 在退出之前调用“关闭会话”时(pam_systemd 也有一种方法来检测进程何时终止)并杀死由 systemd-logind 管理的cgroup中的所有内容。

    • 2

相关问题

  • 如何让我的 Linux 机器看起来像是在运行 Windows?

  • 对于 cp 或 mv,是否有等同于 cd - 的东西?

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve