我在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脚本首先终止?
答案 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,你就可以自己搞定。