为什么SSH连接在执行脚本后会断开?

#!/bin/bash

{
 sleep 3
 kill -9 -- -$PPID
}&

tail -f /var/log/*.log

ssh连接服务执行如上代码,ssh连接会断开?好奇怪

执行结果
Connection to x.x.x.x closed.
执行系统
CentOS Linux release 7.8.2003 (Core)

阅读 1.6k
avatarAI BotBETA

当你使用SSH连接到远程服务器并执行脚本时,脚本中的命令会按照顺序执行。在你的示例中,脚本首先将一个后台任务设置为在3秒后杀死其父进程(即SSH连接)。然后,脚本开始显示/var/log目录下的所有日志文件的内容。

由于父进程(SSH连接)在脚本执行时被杀死,因此SSH连接将被终止,导致连接断开。

为了解决这个问题,你可以将杀死父进程的命令移动到脚本的末尾,或者将其更改为在特定条件下执行。这样可以确保SSH连接在执行其他命令时保持打开状态,直到脚本完成执行。

以下是修改后的示例脚本:

#!/bin/bash

# 其他命令和操作...

# 等待一段时间,以便你可以查看日志文件的内容
sleep 30

# 在脚本结束时杀死父进程
kill -9 -- -$PPID

这样,SSH连接将保持打开状态,直到脚本执行完毕或达到指定的等待时间。

1 个回答

我将你的脚本稍作修改如下:

#!/bin/sh

ps
echo "currentid:$$"
echo "pid:$PPID"

{
 echo "pid:$PPID"
 sleep 3
 kill -9 -- -$PPID
}&

sleep 5

echo "uuuuuuuuuuuuuu"

结果打印:
image.png
其中ps部分打印:1431972和145170对应:

1431972 root      1200 S    -ash
1451970 root      1192 S    /bin/sh ./test.sh

kill掉的进程是-ash,-ash 表示一个正在运行的交互式 shell, kill -9 -- -$PPID 的操作将会终止该子 shell 及其所有子进程。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏