1

我有一个 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")。

4

2 回答 2

0

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

于 2010-05-13T14:38:09.547 回答
0

我写过类似的应用程序。在您的 shell 中包含更多代码会很有帮助。我认为可能有一种方法可以以不同的方式编写您的整个程序来解决这个问题。

于 2010-07-14T14:53:12.673 回答