Systemd基础篇:4:对服务启动出现的问题进行debug的方法

版权声明:本文为博主原创文章,未经博主允许欢迎转载,但请注明出处。 https://blog.csdn.net/liumiaocn/article/details/89086548

在这里插入图片描述
Systemd被诟病的很多的点之一就是出现问题之后很难确认原因,其实在很早的时候systemd就提供了debug的方法,这篇文章介绍常用的一种方式,并结合一个常见的很容易忽视的问题来进行说明。

场景

workingdirectory事前不存在,但是status提示信息过少,journalctl没有有益信息提示,详细可参看下述文章:

设定方式

使用如下方式可以在CentOS7上得到验证可以对服务启动进行debug,与其说debug,更准确地说是打出相关的日志信息以进行辅助。

Step 1: 设定system.conf

对象文件:/etc/systemd/system.conf

  • 修改内容:设定LogLevel

LogLevel=debug

  • 设定例
[root@liumiaocn systemd]# cat system.conf
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See systemd-system.conf(5) for details.

[Manager]
LogLevel=debug
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
#DumpCore=yes
#CrashShell=no
#ShowStatus=yes
#CrashChVT=1
#CtrlAltDelBurstAction=reboot-force
#CPUAffinity=1 2
#JoinControllers=cpu,cpuacct net_cls,net_prio
#RuntimeWatchdogSec=0
#ShutdownWatchdogSec=10min
#CapabilityBoundingSet=
#SystemCallArchitectures=
#TimerSlackNSec=
#DefaultTimerAccuracySec=1min
#DefaultStandardOutput=journal
#DefaultStandardError=inherit
#DefaultTimeoutStartSec=90s
#DefaultTimeoutStopSec=90s
#DefaultRestartSec=100ms
#DefaultStartLimitInterval=10s
#DefaultStartLimitBurst=5
#DefaultEnvironment=
#DefaultCPUAccounting=no
#DefaultBlockIOAccounting=no
#DefaultMemoryAccounting=no
#DefaultTasksAccounting=no
#DefaultTasksMax=
#DefaultLimitCPU=
#DefaultLimitFSIZE=
#DefaultLimitDATA=
#DefaultLimitSTACK=
#DefaultLimitCORE=
#DefaultLimitRSS=
#DefaultLimitNOFILE=
#DefaultLimitAS=
#DefaultLimitNPROC=
#DefaultLimitMEMLOCK=
#DefaultLimitLOCKS=
#DefaultLimitSIGPENDING=
#DefaultLimitMSGQUEUE=
#DefaultLimitNICE=
#DefaultLimitRTPRIO=
#DefaultLimitRTTIME=
[root@liumiaocn systemd]#

Step 2: reboot

重启操作系统

Step 3: 添加Environment

[root@liumiaocn system]# cat liumiaocn.service 
[Unit]
Description=Systemd Service Sample By liumiaocn
Documentation=https://liumiaocn.blog.csdn.net/

[Service]
Environment=SYSTEMD_LOG_LEVEL=debug
WorkingDirectory=/tmp/systemd_working_dir
ExecStart=/usr/bin/echo "hello world"

[Install]
WantedBy=multi-user.target
[root@liumiaocn system]#

确认结果

再次启动测试用的服务

[root@liumiaocn system]# systemctl daemon-reload
[root@liumiaocn system]# systemctl start liumiaocn

然后使用status或者journalctl均可看到更加详细的输入

[root@liumiaocn system]# systemctl status liumiaocn
● liumiaocn.service - Systemd Service Sample By liumiaocn
   Loaded: loaded (/usr/lib/systemd/system/liumiaocn.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Fri 2019-04-05 20:31:25 CST; 7s ago
     Docs: https://liumiaocn.blog.csdn.net/
  Process: 3311 ExecStart=/usr/bin/echo hello world (code=exited, status=200/CHDIR)
 Main PID: 3311 (code=exited, status=200/CHDIR)

Apr 05 20:31:25 liumiaocn systemd[1]: Forked /usr/bin/echo as 3311
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service changed dead -> running
Apr 05 20:31:25 liumiaocn systemd[1]: Job liumiaocn.service/start finished, result=done
Apr 05 20:31:25 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:31:25 liumiaocn systemd[1]: Child 3311 belongs to liumiaocn.service
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service changed running -> failed
Apr 05 20:31:25 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service failed.
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service: cgroup is empty
[root@liumiaocn system]# 
  • journalctl输出
[root@liumiaocn system]# journalctl -u liumiaocn
-- Logs begin at Fri 2019-04-05 20:30:17 CST, end at Fri 2019-04-05 20:31:42 CST. --
Apr 05 20:31:25 liumiaocn systemd[1]: Trying to enqueue job liumiaocn.service/start/replace
Apr 05 20:31:25 liumiaocn systemd[1]: Installed new job liumiaocn.service/start as 4624
Apr 05 20:31:25 liumiaocn systemd[1]: Enqueued job liumiaocn.service/start as 4624
Apr 05 20:31:25 liumiaocn systemd[1]: About to execute: /usr/bin/echo 'hello world'
Apr 05 20:31:25 liumiaocn systemd[1]: Forked /usr/bin/echo as 3311
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service changed dead -> running
Apr 05 20:31:25 liumiaocn systemd[1]: Job liumiaocn.service/start finished, result=done
Apr 05 20:31:25 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:31:25 liumiaocn systemd[1]: Child 3311 belongs to liumiaocn.service
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service changed running -> failed
Apr 05 20:31:25 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service failed.
Apr 05 20:31:25 liumiaocn systemd[1]: liumiaocn.service: cgroup is empty
[root@liumiaocn system]#

总结

按照本文的步骤即可对服务进行debug信息的输出,但是至于从日志中能否看出期待的结果,那是systemd需要回答的另外一个问题了,所以经验的总结和归纳也非常重要,毕竟systemd已经是目前的主要方式了。

猜你喜欢

转载自blog.csdn.net/liumiaocn/article/details/89086548