我有一个 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。
所以我尝试改变等待睡眠,然后收到 SIGHUP 和 SIGCONT 。
问题是:为什么等待会阻塞 SIGHUP?
编辑2:解决
我使用 -t 选项解决了它轮询封闭标准输入的问题。为了解决 read 内置的错误,我在一个新的 bash 中生成它(bash -c "read -t 3 dummy")。