如果我通过 ssh 连接到服务器,并且打开 top 数据包正在通过网络发送,那么正常的 ssh 超时(由于空闲)将不起作用。
这意味着如果用户正在运行 top 进程,则 ssh 连接可以永远保持打开状态。
有没有办法在一定时间后强制 ssh 超时(或断开连接),以避免仅仅因为打开了 top 而永远保持连接?
更新: 场景是人们在服务器上使用 ssh 打开 top,只要他们不自行关闭 top,ssh 就会永远保持打开状态,这意味着可以多次执行此操作,当我登录到服务器并执行“w”命令(显示谁已登录)时,会发现许多 ssh 会话的 top 打开时间已超过数周
答案1
很遗憾,顶部是一个前台进程。当这样的前台进程运行时,你不能无法真正知道用户是处于活动状态还是离开状态。这就是为什么任何连接/shell 超时机制(ssh 超时、shell 超时等)在这种情况下都无法工作。
我能想到的唯一能实现你(可能)想要的方法是让进程/命令本身超时。它适用于单个特定命令,你需要对任何想要超时的命令执行此解决方案。
要使 shell 中的命令超时:
timeout 60 command
60
强制停止进程之前 shell 等待的时间(以秒为单位)是 多少。
您可以使用超时命令来避免忘记前台进程,例如顶部open 会导致无限打开 SSH 连接:
timeout 3600 top
当然,每次都写出带有超时的整个命令是很麻烦的,而且你很容易忘记这样做,所以你可以别名这顶部命令,或者在另一种情况下 - 如果您希望它是全局的,您可以将top
二进制文件移动到其他地方并替换/usr/bin/top
为启动顶部命令超时。笔记如果您想在这样的脚本中使用它,您需要使用 开关--foreground
,timeout
否则它将在子 shell 中启动命令。/usr/bin/top
例如的内容:
/usr/bin/timeout --foreground 3600 /path/to/real/top
另一点:如果您决定使用“全局解决方案”,则应该再考虑一下。我给出的只是一个建议和一个方向。在软件包更新到顶部甚至可能会破坏更新。
答案2
打开与服务器的另一个 ssh 连接并识别进程,然后执行 sigint kill 命令。
ps -g
kill psid
查找类似“/bash top”之类的内容,那就是您可以终止的进程。这一切都假设您在服务器上拥有超级用户权限,因为如果您没有,您就无法对其他类似的进程执行此操作。
另外,我来到这个帖子的原因是我喜欢打开多个终端,有时 ssh 会超时,我正在寻找一种不超时的方法,所以感谢您在问题中指出我的解决方案。