2010-05-13 64 views
1

我有一个bash脚本,它充当用户登录槽ssh的默认shell。 它提供了一个菜单,其中有几个选项是使用netcat发送文件的。如何从bash脚本知道用户是否突然关闭ssh会话

我使用的嵌入式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选项内建读一个封闭的标准输入。要解决内置读取中的错误,我使用新的bash(bash -c“read -t 3 dummy”)生成它。

回答

0

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

+0

即使它不是一个正在运行的进程,它也不会改变。 – Figo 2010-05-13 15:13:30

+0

剧本运行时你有什么陷阱?陷阱命令本身应该告诉你。 – 2010-05-13 15:50:43

+0

我已编辑帖子来回答你的问题。 – Figo 2010-05-14 09:53:33

0

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

+0

感谢您的帮助,但我转移到另一个项目,现在我没有代码。 – Figo 2010-08-02 10:33:25

相关问题