bash进程的PID未被$捕获!


2

虽然脚本的这一部分可以正常工作:

geany &
pid=$!
...
kill -KILL $pid

相反,事实并非如此。

lxterminal &
pid=$!
...
kill -KILL $pid

看起来bash进程仍在后台,但未由标识$pid。如何获取终端窗口的PID,以便以后可以终止该进程?

注意:我也尝试用它的名字杀死它,但是该--title选项引起了与的某种冲突PROMPT_COMMAND


4
如果lxterminal进行第二次分叉,您将无法轻松获得最终孙子的pid。
9000

@ 9000恐怕是如此……
nightcod3r 16-12-29

Answers:


1

当然,lxterminal分叉是一个子进程。想一想。该子进程是通过(或随该选件提供的任何替代程序)连接到仿真终端的交互式外壳。反过来,根据在该Shell中实际执行的操作,它又进行了更多的子孙处理。lxterminal-e

Killing lxterminal关闭了它使用的伪终端的主端,就从属端而言,它看起来像是终端挂断。从属方是交互式外壳视为其控制终端的对象。因此,SIGHUP如果终端的-hupcl设置为开,那么外壳应该看到正常的终端挂断,并向会话领导者生成a 。该会话负责人就是该shell进程。

会话负责人负责会话中的作业控制,并将挂断信号传递到其所有作业。显然,如果您disown编辑了某个由该shell运行的东西,或者对其进行了nohupped操作,则会话负责人不会传递挂断信号,并且即使lxterminal终止并且伪终端的主端已关闭,某些东西也将继续运行。这就是disownnohup

您需要弄清楚为什么在虚拟终端挂断后,在该交互式会话中运行的任何内容都不会消失。您还没有告诉我们任何相关信息,我们也不是心灵感应。因此,除了一般性的建议之外,几乎没有什么建议会话领导者shell设计要做什么的。


在新会话中什么也没有运行,新终端启动并等待提示行中的命令。就是这样 运行程序(例如-e "sleep 2")时,它将执行命令,并且终端消失。(顺便说一句,感谢您对工作原理的详细说明。)
nightcod3r

0

由于@ 9000已添加评论,因此lxterminal可能会再次分叉。很难获得新fork的进程ID,这就是为什么$!不起作用的原因。


0

这可能有效。但是我还没有测试。

lxterminal &
pid=$!
kill -KILL "$(ps -ho ppid,pid | grep ^$pid | cut -d' ' -f2)"
  • ps -ho ppid,pid 获取当前运行进程的PPID(父PID)和PID。
  • 然后grep ^$pid筛选出有什么不分叉的$pid,因此受到lxterminal的背景。
  • 最后,cut选择孙子的PID。

引发此错误:bash: kill: '': not a pid or valid job specpid的值是16209,但它不在进程列表中,甚至不在kill命令之前。
nightcod3r

@ nightcod3r如果仅用以下内容替换第三行:ps -ho ppid,pid | grep ^$pid,它显示任何内容吗?
Tomasz

恐怕没有。没有任何显示,什么也没有发生,外壳保持打开状态。我的意思是:这次没有错误消息。
nightcod3r

就像该过程不再存在。
nightcod3r

psafter 的输出是lxterminal &什么?在第一个终端中,就是这样。
Tomasz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.