版权声明:本文为博主原创文章,未经博主允许欢迎转载,但请注明出处。 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已经是目前的主要方式了。