systemd为啥会kill进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了systemd为啥会kill进程相关的知识,希望对你有一定的参考价值。

一般情况,shutdown.sh是可以停止java进程的,有的时候可能需要等待几十秒java进程才能关掉;但有时可能因为java程序的问题,java进程会一直存在,那只能kill掉进程了,这种情况除了优化java程序貌似别无他法。LZ一定要等现有tomcat的java进程关掉后,再启tomcat,不要启多个tomcat,否则你的应用会有问题-----服务器端口会被之前的进程占用,后启的tomcat是不工作的。 参考技术A Systemd服务的内容主要分为三个部分,控制单元(unit)的定义、服务(service)的定义、以及安装部分。和SysVinit脚本的差异过去,*nix服务(守护精灵)都是用SysV启动脚本启动的。SysV启动脚本就是Bash脚本,通常在/etc/init.d目录下,可以被一些标准参数如start,stop,restart等调用。启动该脚本通常意味着启动一个后台守护精灵(daemon)。shell脚本常见的缺点就是,慢、可读性不强、太详细又很傲娇。虽然它们很灵活(毕竟那就是代码呀),但是有些事只用脚本做还是显得太困难了,比如安排并列执行、正确监视进程,或者配置详细执行环境。SysV启动脚本还有一个硬伤就是,臃肿,重复代码太多。因为上述的“标准参数”必须要靠各个脚本来实现,而且各个脚本之间的实现都差不多(根本就是从一个skeleton骨架来的)。而Systemd则进行了统一实现,也就是说在Systemdservice中完全就不需要、也看不到这部分内容。这使得Systemd服务非常简明易读,例如NetworkManager这一重量级程序的服务,算上注释一共才有19行。而它相应的SysV启动脚本头100行连标准参数都没实现完。Systemd兼容Sysv启动脚本,这也是为什么这么久我们仍然需要一个systemd-sysvinit软件包的原因。但是根据以上理由,最好针对所有您安装的守护精灵都使用原生Systemd服务来启动。另外,Systemd服务可无缝用于所有使用Systemd的发行版,意思是Arch下编写的脚本拿过来依然能够使用。通常来说,上游应该在发布源代码的同时发布Systemd服务,但如果没发布,你可以对照本教学来为它们写一个并贡献给它们。关于SysVinit启动脚本的编写可见openSUSE:Packaging_init_scripts,这主要用于你的服务器,毕竟服务器追求稳定软件更新的不是很勤(但你一定不知道欧盟汽车里的车载系统必须是Systemd)。真正开始前需要注意的问题如上所述,Systemd的service文件是完全跨发行版的,所以有时候没有必要重造轮子。真正编写你的服务前,请确认它在各大发行版中完全就不存在:我们的Systemd服务集合FedoraSystemd服务集合ArchLinuxSystemd服务集合GentooSystemd服务集合Debian中的少量Systemd服务ubuntu中的少量Systemd服务Systemd语法Systemd语法和.desktop文件的语法比较像,也比较类似Windows下的.ini文件,因此无论对于打包者还是最终用户都是非常容易上手的。主要格式请见下面的小例子,这里需要说明三点:Systemd单元文件中的以“#”开头的行后面的内容会被认为是注释Systemd下的布尔值,1、yes、on、true都是开启,0、no、off、false都是关闭。注:仅限于Systemd文件,比如:RemainOnExit=yes并不适用于该文件中嵌入的shell语句,比如:ExecStartPre=/usr/bin/test"x$NETWORKMANAGER"=xyes这里的yes就不能替换。因为等号后面是一条嵌入的shell语句。Systemd下的时间单位默认是秒,所以要用毫秒(ms)分钟(m)等请显式说明。一个小例子NetworkManager的Systemdservice:[Unit]Description=NetworkManagerAfter=syslog.targetWants=remote-fs.targetnetwork.target[Service]Type=dbusBusName=org.freedesktop.NetworkManagerExecStart=/usr/sbin/NetworkManager--no-daemonEnvironmentFile=/etc/sysconfig/network/configExecStartPre=/usr/bin/test"x$NETWORKMANAGER"=xyes#Suppressstderrtoeliminateduplicatedmessagesinsyslog.NMcallsopenlog()#withLOG_PERRORwhenruninforeground.Butsystemdredirectsstderrto#syslogbydefault,whichresultsinloggingeachmessagetwice.StandardError=null[Install]WantedBy=multi-user.targetAlso=NetworkManager-wait-online.service

没有为 systemd 服务生成核心转储

【中文标题】没有为 systemd 服务生成核心转储【英文标题】:no core dump generated for systemd service 【发布时间】:2018-01-17 10:17:39 【问题描述】:

我想为提供 SEGV 状态并退出的 systemd 服务启用核心转储生成。

scd.service:主进程退出,code=killed,status=11/SEGV

单元 scd.service 进入失败状态。

scd.service 失败。

我的 bashrc 文件已经有 ulimit -c unlimited。

运行 systemd-coredumpctl 后输出为

未找到核心转储。

注意:我可以为通过终端执行的普通程序生成核心转储,但无法为 systemd 服务生成核心转储

【问题讨论】:

只是为了澄清您需要在您的服务文件 (scd.service) 中设置 LimitCORE=Infinity,而不是您的 bashrc 感谢您的建议成功 我会添加一个答案,这样你就可以接受这个答案,这样其他有相同问题的人就可以看到这个答案了 【参考方案1】:

您需要在您的服务文件 (scd.service) 中设置 LimitCORE=infinity,而不是在您的 bashrc 中。

更多信息https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Process%20Properties

【讨论】:

以上是关于systemd为啥会kill进程的主要内容,如果未能解决你的问题,请参考以下文章

systemd 为啥会有那么大的争议

没有为 systemd 服务生成核心转储

systemd启动过程

CentOS 7 系列系统服务 systemd

为啥那么多人讨厌systemd

Centos7 之 Systemd