AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 471593
Accepted
joker
joker
Asked: 2018-09-27 05:33:04 +0800 CST2018-09-27 05:33:04 +0800 CST 2018-09-27 05:33:04 +0800 CST

bg 和 kill -CONT 的区别

  • 772

我在前台运行一个应用程序,然后通过点击CTRL+ Z(并停止)将其置于后台。为了让它重新运行,我运行了命令bg %1(这是它的 JOBSPEC)。

我想为什么不尝试让它运行回来kill -CONT <PID>。所以,我跑去jobs -l获取它的 PID,并将这个 pid 与带有 CONT 信号的 kill 一起使用。

然而,该节目并没有再次上线!jobs -l尝试用 CONT 杀死后报告它正在运行,但它不是(因为它是灰色的)。

我使用命令查看了应用程序 PID ps,发现两个具有不同 PID(和 status Tl)的相同命令。

然后我查看了同样的东西pstree,发现它们都在一个父进程下。父进程与列出的进程不同,jobs -l因为我放在后台的似乎启动了另一个程序。另一个程序似乎创建了子进程。

我注意到的总结如下:

  • 使用kill将 CONT 发送到父进程使程序运行。

  • 父进程 PID 与 报告的不同jobs -l。换句话说,我应该发送 CONT 信号的过程与我使用jobs -l.

  • 向父进程发送 CONT 不会对子进程应用相同的信号。

  • 使用命令bg返回一个进程运行,发送 CONT 信号给父进程的所有子进程。

我的结论正确吗?如果是这样,那么这意味着使用该命令bg将节省向每个相关进程发送 CONT 的时间。这是正确的吗?

编辑我从命令行调用并放在后台的主要应用程序是git difftool. 我正在谈论的另一个应用程序本身创建了新的子meld节点,我将其设置为用作 git 中的差异工具。

linux kill
  • 2 2 个回答
  • 2463 Views

2 个回答

  • Voted
  1. Best Answer
    mosvy
    2018-09-27T16:12:17+08:002018-09-27T16:12:17+08:00

    首先,jobs -l不列出进程,而是列出进程组(又名作业)。每个进程组都有一个进程负责人,其进程 id (pid) 等于它的进程组 id (pgid)。

    为了向进程组中的所有进程发送信号,而不仅仅是向其领导者发送信号,您应该kill使用 pgid 的负数进行调用。这在 kill(2) 联机帮助页中有描述:

    如果 pid 小于 -1,则将 sig 发送到 ID 为 -pid 的进程组中的每个进程。

    在 shell 中也是如此:

    $ sh -c 'while echo -n 1; do sleep 1; done'
    111^Z
    [1]+  Stopped                 sh -c 'while echo -n 1; do sleep 1; done'
    $ jobs -l
    [1]+ 11046 Stopped                 sh -c 'while echo -n 1; do sleep 1; done'
    $ kill -CONT 11046
       <nothing>
    $ kill -CONT -11046
    $ 11111111...
    

    现在,你的结论:

    使用 kill 将 CONT 发送到父进程使程序运行。

    正确的

    父进程 PID 与作业 -l 报告的不同。换句话说,我应该向其发送 CONT 信号的进程与我使用 jobs -l 找到的进程不同。

    错了,是同一个pid,和它的pgid也是同一个。

    向父进程发送 CONT 不会对子进程应用相同的信号。

    正确的

    使用命令 bg 使进程返回运行,向父进程及其所有子进程发送 CONT 信号。

    是的,但前提是父进程和子进程都在同一个进程组中。此外,它不会为每个进程依次调用 kill(2),它只是使用 pgid 的负数(=进程组领导的 pid)调用它一次,并依赖内核将信号路由到所有进程在那个组。

    • 5
  2. roaima
    2018-09-27T06:38:02+08:002018-09-27T06:38:02+08:00

    我在这里看不到这种行为。

    • 这是我的示例代码,在命令行中逐字输入:

      bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
      
    • 收到This is child xx消息后,单击CtrlZ以暂停该过程。

    • 再等待 7 秒以确认它确实已暂停

    • 现在jobs -l列出进程领导者(父 PID)。实际上,我们可以使用工作编号,在这种情况下%1

    • 在后台继续该过程kill -CONT %1

    我看到孩子继续然后退出,让父母完成。

    这是完整的运行结果(包括>$shell提示)

    >$ bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
    This is parent 2004
    This is child 10696
    
    [1]+  Stopped                 bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
    >$ jobs -l
    [1]+  2004 Stopped                 bash -c 'echo This is parent $$; sleep 7; bash -c "echo This is child \$$; sleep 7; echo Child done"; echo This is parent $$ again; sleep 7'
    >$ kill -CONT %1
    >$ Child done
    This is parent 2004 again
    

    如果您想进一步试验自动测试线束,您可以使用发送与键盘上kill -TSTP ...生成的信号相同的信号。CtrlZ

    • 0

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve