首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >孤立子项(ksh Shell脚本不会在按CTRL-X组合键时首先终止)

孤立子项(ksh Shell脚本不会在按CTRL-X组合键时首先终止)
EN

Stack Overflow用户
提问于 2013-06-26 06:24:20
回答 2查看 731关注 0票数 0

我在AIX5.3上有一个启动C++脚本()的程序()。

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

代码语言:javascript
复制
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++可执行文件)进程被终止,而外壳脚本继续执行。

代码语言:javascript
复制
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脚本?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-26 20:13:32

注意: Launcher坏了,需要修复。因此,任何“解决方案”都将是一个黑客。

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

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

最后,您可以将脚本包装在脚本中,并使用该技术杀死孩子并退出。例如(未测试)

代码语言:javascript
复制
#!/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为:

代码语言:javascript
复制
#!/bin/ksh

./s2 &
sleep 10
exit

./s2为:

代码语言:javascript
复制
#!/bin/ksh

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

Stack Overflow用户

发布于 2021-06-03 20:55:33

ksh总是这样做。与bash不同的是,ksh不会在您退出时转发hup信号。如果你能找到孩子的pids,你就可以自己安装它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17308603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档