0

我在 AIX 5.3 上有一个启动 Shell 脚本 (ksh) 的程序(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 组合键以结束并退出 Shell 脚本时,主启动程序(C++ 可执行文件)进程被终止,而 shell 脚本继续执行。

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 脚本首先终止?

4

2 回答 2

1

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

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

我不明白 control-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
于 2013-06-26T12:13:32.430 回答
0

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

于 2021-06-03T12:55:33.477 回答