如何从bash脚本中了解用户是否突然关闭ssh会话

时间:2010-05-13 13:59:21

标签: linux bash shell embedded-linux

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

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

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

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

  • 捕获SIGHUP:未发布。我发现的唯一信号是SIGCONT,但我不认为它是可靠和便携的。
  • 使用read命令的-t选项来检测已关闭的stdin:如果不是嵌入式读取命令中的愚蠢错误(仅在第一次调用时超时),这将起作用。

修改

我会尝试回答评论中的问题并进一步解释情况。

我的代码是:

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 builtin对已关闭的stdin进行轮询的情况。为了解决read builtin中的错误,我在一个新的bash中生成它(bash -c“read -t 3 dummy”)。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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