当前位置: 首页 > 知识库问答 >
问题:

SIGTERM无法终止进程

漆雕博
2023-03-14

我有一个单线程进程,它不会在终止条件下死亡。处理信号掩码未显示SIGTERM被阻塞。我以root身份执行“kill”。我可以使用SIGKILL终止进程,但这是更大系统的一部分,我希望SIGTERM能够工作。

$ cat /proc/5105/status
Name:   task_root.nginx
State:  S (sleeping)
Tgid:   5105
Pid:    5105
PPid:   1
TracerPid:  0
Uid:    1000    1000    1000    1000
Gid:    1000    1000    1000    1000
FDSize: 256
Groups: 4 24 27 30 46 109 124 1000 
VmPeak:  3304480 kB
VmSize:  3304472 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:    249060 kB
VmRSS:       320 kB
VmData:  3228468 kB
VmStk:      1012 kB
VmExe:      3020 kB
VmLib:     30232 kB
VmPTE:      1076 kB
VmSwap:   248288 kB
Threads:    1
SigQ:   0/63014
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000004
SigIgn: 0000000000000000
SigCgt: 2000000181001cef
CapInh: 0000000000000000
CapPrm: 0000000000200000
CapEff: 0000000000200000
CapBnd: ffffffffffffffff
Cpus_allowed:   ff
Cpus_allowed_list:  0-7
Mems_allowed:   00000000,00000001
Mems_allowed_list:  0
voluntary_ctxt_switches:    16
nonvoluntary_ctxt_switches: 1

注意Sig*属性。SigCgt、SigIgn和SigBlk表示SIGTERM既没有被捕获、忽略或阻塞(第15位未设置-将最低有效位计算为#1)。由于SIGTERM的默认配置是终止进程,我希望它会被杀死。但这并没有发生——

$ sudo kill -TERM 5105

$ cat /proc/5105/status | grep Name
Name:   task_root.nginx

该流程在wait()系统调用中被阻塞,等待子流程的终止:

$ sudo cat /proc/5105/stack
[<ffffffff8106bfc4>] do_wait+0x1e4/0x260
[<ffffffff8106d230>] sys_wait4+0xa0/0xf0
[<ffffffff81668d02>] system_call_fastpath+0x16/0x1b
[<ffffffffffffffff>] 0xffffffffffffffff

该进程是使用clone()创建的单线程进程,带有SIGCHLD | CLONE _ NEWPID | CLONE _ NEWNS标志。从父(默认)PID名称空间来看,PID 5105是顶级PID。

用SIGKILL杀死进程表明PID或进程跟踪不是问题。

共有1个答案

东郭远航
2023-03-14

您确定 SIGTERM 是系统上的 15 号信号吗?你没有在问题中指定操作系统或架构,但很可能你可以使用“kill -l”来列出信号(这是一个小写字母L,而不是数字字母L)。如果您停止该过程,然后杀死 -TERM 它,会发生什么情况?例如:

strace -Tttf -o strace.out -p 5105 &
kill -TERM 5105

信号屏蔽是否发生变化?strace还应显示是否发生了这种情况。

 类似资料:
  • 原始问题(在CTRL C上向孩子发送SIGTERM,父母应该等待它关闭)。请参阅下面的更新! 我有一个PHP脚本(见下文)启动一个进程并跟踪它的输出。这个过程一直运行,直到我通过按CTRL+C或者向PHP脚本(pid)发送一个SIGTERM信号来请求PHP停止。此时,PHP决定立即终止由proc_open启动的进程,而不是优雅地关闭它,并在关闭自己之前等待它,我该如何实现这一点? 我尝试了一些东西

  • 问题内容: 我们有一个自定义服务,我们将其与应用程序一起安装。唯一的问题是,安装后它将无法启动,从而产生上述错误。我试图诊断出问题所在,但似乎找不到有关退出原因的有用信息。我已经在非“ R2” 2008服务器上尝试了相同的服务,并且手动运行正常。 服务使用批处理文件运行的简单Java文件。恶魔服务。 有没有人有解决此类问题的经验,线索很少? 问题答案: 去: 注册表-> HKEY_LOCAL‌_M

  • 我对使用selenium java非常陌生。我完成了在线教程,运行了一个简单的程序来测试一个页面是否成功打开。 我不确定为什么会出现这些错误消息。自从我抄了 请帮忙!,我不明白出了什么问题。。 ----节目---- ----错误消息---- 1477634165078 geckodriver信息收听127.0.0.1:15694 2016年10月28日下午4:56:05组织。openqa。硒。遥远

  • 主要内容:执行步骤到目前为止,我们知道每当执行一个程序时,就会创建一个进程,并在执行完成后终止。 如果我们需要在程序中创建一个进程,并且可能希望为其安排不同的任务。 这可以实现吗? 是的,显然是通过进程创建来实现。 当然,工作完成后进程会自动终止,或者根据需要终止。 过程创建是通过系统调用实现的。 新创建的进程称为子进程,启动该进程的进程(或执行开始时的进程)称为父进程。 在系统调用之后,现在有两个进程 - 父进程

  • 问题内容: 我的数据库中的临时回滚模式下有一个未提交的语句。当我尝试终止与此语句关联的SPID时,出现以下错误: 正在进行事务回滚。估计回滚完成:0%。估计剩余时间:0秒。 此未提交的语句使用户无法查看数据库的表,视图和过程树。如何停止此SPID? 问题答案: 未提交的事务是数据库备份。有一个已知的错误(以及MS Hotfix),有时备份会挂起。重新启动群集解决了该问题

  • 我需要运行一个巨大的过程,这将运行10分钟左右。我最大化了< code>max_execution_time,但是在我的错误日志中,我得到了一个SIGTERM,然后是一个SIGKILL。 我读了一些关于SIGTERM和SIGKILL的文章,说它们来自于守护进程,但我没有找到阻止它发生的方法。我只需要禁用它一晚。