繁体   English   中英

如何从bash脚本知道用户是否突然关闭ssh会话

[英]How to know from a bash script if the user abruptly closes ssh session

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

我正在使用的嵌入式Linux的netcat缺少-w选项,因此,如果用户关闭ssh连接而不发送文件,则netcat命令将永远等待。

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

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

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

编辑:

我将尝试回答评论中的问题,并进一步说明情况。

我的代码是:

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来轮询封闭的stdin的问题。 要解决内置读取操作中的错误,我以新的bash(bash -c“读取-t 3虚拟对象”)生成了它。

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

我已经写过类似的应用程序。 在shell中包含更多代码将很有帮助。 我认为可能有一种方法可以解决这个问题,从而编写不同的整体程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM