Systemd基础篇:workingdirectory事前不创建会导致的问题

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

在这里插入图片描述
Systemd下的服务配置,如果设定使用了workingdirectory,但是在systemctl start之前没有创建该目录,将会无法正常启动,并且根据缺省方式下的status提示信息和journalctl无法清楚地定位问题,尤其是在systemd的设定较多时,使用这篇文章memo一下。

再现示例: 事前准备

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

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

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

启动与status确认

可以看到提示的错误信息中有200/CHDIR,在知道原因之后会发现这已经给予了提示,但是较为隐蔽。

[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:04:04 CST; 13s ago
     Docs: https://liumiaocn.blog.csdn.net/
  Process: 5726 ExecStart=/usr/bin/echo hello world (code=exited, status=200/CHDIR)
 Main PID: 5726 (code=exited, status=200/CHDIR)

Apr 05 20:04:04 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:04:04 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:04:04 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:04:04 liumiaocn systemd[1]: liumiaocn.service failed.
[root@liumiaocn system]# 

journalctl确认

从journalctl中也看不出来有价值的内容

[root@liumiaocn system]# journalctl -u liumiaocn
-- Logs begin at Fri 2019-03-29 13:08:00 CST, end at Fri 2019-04-05 20:25:38 CST. --
Apr 05 20:03:14 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:03:14 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:03:14 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:03:14 liumiaocn systemd[1]: liumiaocn.service failed.
Apr 05 20:03:44 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:03:44 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:03:44 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:03:44 liumiaocn systemd[1]: liumiaocn.service failed.
Apr 05 20:04:04 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:04:04 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:04:04 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:04:04 liumiaocn systemd[1]: liumiaocn.service failed.

创建目录后能正常动作

[root@liumiaocn system]# mkdir -p /tmp/systemd_working_dir
[root@liumiaocn system]# systemctl start liumiaocn
[root@liumiaocn system]# echo $?
0
[root@liumiaocn system]# 
[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: inactive (dead)
     Docs: https://liumiaocn.blog.csdn.net/

Apr 05 20:03:44 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:03:44 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:03:44 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:03:44 liumiaocn systemd[1]: liumiaocn.service failed.
Apr 05 20:04:04 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:04:04 liumiaocn systemd[1]: liumiaocn.service: main process exited, code=exited, status=200/CHDIR
Apr 05 20:04:04 liumiaocn systemd[1]: Unit liumiaocn.service entered failed state.
Apr 05 20:04:04 liumiaocn systemd[1]: liumiaocn.service failed.
Apr 05 20:12:38 liumiaocn systemd[1]: Started Systemd Service Sample By liumiaocn.
Apr 05 20:12:38 liumiaocn echo[5746]: hello world
[root@liumiaocn system]# 

总结

Systemd的配置文件,如果使用到workingdirectory,需要事先保证该目录的创建。至于问题的追踪,可以考虑使用systemd提供的debug日志进行确认,至少会比确认status=200/CHDIR的信息要容易地多。

关于使用systemd下进行debug的方式,可参看如下文章:

猜你喜欢

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