孤儿子(ksh Shell脚本在CTRL-X时不首先终止)

时间:2013-06-25 22:24:20

标签: bash shell ksh aix

我在AIX 5.3上有一个启动Shell脚本(ksh)的程序(C ++ Executable)。

当我启动程序和shell脚本时,我看到两个进程

AIX:>ps -ef | grep 3657892
u001 **3657892** 3670248   0 18:16:34 pts/11  0:00 /u0012006/bin/Launcher
u001 3723398 **3657892**   0 18:16:41 pts/11  0:00 /usr/bin/ksh /u0012006/shell/Trjt_Slds.sh -m

现在,当我在键盘上执行CTRL-X组合键结束并退出Shell脚本时,主脚本继续执行时,主启动程序(C ++ Executable)进程被终止。

AIX:>ps -ef | grep 3723398    
u001 3723398       1 106 18:16:41 pts/11  0:01 /usr/bin/ksh /u0012006/shell/Trjt_Slds.sh -m
u001 3731504 3723398   0                  0:00 <defunct>
u001 3735612 3723398   0                  0:00 <defunct>
u001 3739838 3723398   0                  0:00 <defunct>

这导致CPU消耗率达到100%并且许多已失效的进程已启动。

当我执行CTRL-X时,有没有办法让AIX Shell脚本首先终止?

2 个答案:

答案 0 :(得分:1)

注意:启动器坏了,应该修复。因此,任何“解决方案”都将是一个黑客攻击。

一种想法是在脚本中的各个位置检查$ PPID。如果设置为1(init),则退出脚本。

我不明白控制-X的使用。这不会产生任何tty信号。我猜这就是你想要的。也许tty也处于原始模式。但你可能会考虑将control-X挂到各种tty信号之一,如SIGINT。例如stty intr ^X但您还需要记住使用stty intr ^C

取消设置

最后,您可以将脚本包装在脚本中并使用该技术来终止子进程并退出。例如(另)

#!/bin/ksh
# launch original program in background
/path/to/real/program "$@" &
# get child's pid
child=$!

while : ; do
  # when we become an orphan
  if [[ $$PPID -eq 1 ]] ; then
    # kill the child and exit
    kill $child
    exit
  fi
  # poll once a second
  sleep 1
done

更新

./ s1是:

#!/bin/ksh

./s2 &
sleep 10
exit

./ s2是:

#!/bin/ksh

while : ; do
  if kill -0 $PPID ; then
    echo still good
  else
    echo orphaned
    exit
  fi
  sleep 1
done

答案 1 :(得分:0)

ksh 总是这样做。刚刚被这个咬了,与 bash 不同,ksh 在您退出时不会转发 hup 信号。如果你能找到孩子的 pid,你就可以自己搞定。