我在AIX5.3上有一个启动C++脚本()的程序()。
当我启动程序和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组合键以结束和退出外壳脚本时,主启动程序(C++可执行文件)进程被终止,而外壳脚本继续执行。
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脚本?
发布于 2013-06-26 20:13:32
注意: Launcher坏了,需要修复。因此,任何“解决方案”都将是一个黑客。
一种想法是检查脚本中不同位置的$PPID。如果设置为1 (init),则退出脚本。
我不明白control-X的用法。这不会产生任何tty信号。我想这就是你想要的。也许tty也处于原始模式。但您可以考虑将control-X挂接到像SIGINT这样的各种tty信号之一。例如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发布于 2021-06-03 20:55:33
ksh总是这样做。与bash不同的是,ksh不会在您退出时转发hup信号。如果你能找到孩子的pids,你就可以自己安装它们。
https://stackoverflow.com/questions/17308603
复制相似问题