linux - 如果用户突然关闭 ssh session ,如何从 bash 脚本中获知

标签 linux bash shell embedded-linux

我有一个 bash 脚本,它充当用户通过 ssh 登录的默认 shell。 它提供了一个包含多个选项的菜单,其中之一是使用 netcat 发送文件。

我正在使用的嵌入式 linux 的 netcat 缺少 -w 选项,因此如果用户在没有发送文件的情况下关闭 ssh 连接,netcat 命令将永远等待。

我需要知道用户是否突然关闭连接,以便脚本可以终止 netcat 命令并正常退出。

到目前为止我尝试过的事情:

  • 捕获 SIGHUP:它未发出。我能找到的唯一发出的信号是 SIGCONT,但我认为它不可靠且可移植。
  • 使用读取命令的 -t 选项来检测关闭的标准输入:如果不是嵌入式读取命令中的一个愚蠢错误(仅在第一次调用时超时),这将起作用

编辑:

我会尽力回答评论中的问题并进一步说明情况。

我的代码是:

nc -l -p 7576 > /dev/null 2>> $LOGFILE < $TMP_DIR/$BACKUP_FILE &
wait

我忽略了 SIGINT 和 SIGTSTP,但我试图捕获所有信号,但唯一收到的信号是 SIGCONT。

阅读 bash 手册页我发现 SIGHUP 应该同时发送到脚本和 netcat,并且 SIGCONT 被发送到停止的作业以确保它们收到 SIGHUP。

我猜等待使脚本算作已停止,因此它收到了 SIGCONT,但同时等待以某种方式耗尽了 SIGHUP。

所以我尝试更改等待 sleep 时间,然后同时收到 SIGHUP 和 SIGCONT。

问题是:为什么等待会阻塞 SIGHUP?


编辑 2:已解决

我通过使用 -t 选项的 read 内置函数轮询一个封闭的标准输入来解决这个问题。为了解决 read 内置函数中的错误,我在一个新的 bash 中生成它(bash -c "read -t 3 dummy")。

最佳答案

Parent PiD 是否改变?如果是这样,您可以在进程列表中查找父进程并确保进程名称正确。

关于linux - 如果用户突然关闭 ssh session ,如何从 bash 脚本中获知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2827335/

相关文章:

c - Bash 一个 liner 来编译、执行和回显返回值?

linux - Azure Batch 使用哪种 "command line"来执行 Ubuntu 上的启动任务?

bash - 设置 -e 选项后如何避免 bash 脚本失败?

java - 我们可以使用脚本语言检查队列深度吗?

bash - 将 shell 脚本输出复制到剪贴板

c - 在 C 中的套接字上使用标准 read() 和 write() 调用

linux - 按日期将 Linux 终端输出记录到文件?

linux - 进程间通信

linux - UNIX 和 Linux 中的 ls -ltr 命令 - 行为

linux - 遍历命令行参数对