systemd 启动脚本时的问题

使用systemd系统启动脚本服务,服务启动正常,但是脚本没有按照我们预想的方式运行,没有输出信息。

1、测试环境

ubuntu 16.04 32位

2、测试脚本

脚本路径为 /home/work/shell,编写的脚本如下:

#!/bin/bash

while true
do
        echo `date`  >> ./data.log
        sleep 10
done

在脚本所在目录下,手动执行脚本工作正常:

systemd 启动脚本时的问题_第1张图片

3、使用systemd系统启动

编写systemd服务配置如下。将配置文件放到/ect/systemd/system路径下。

[Unit]
Description=start shell

[Service]
Type=simple
ExecStart=/home/work/shell/systemd.sh 
ExecReload=/home/work/shell/systemd.sh 
Restart=always
RestartSec=10s
User=root

[Install]
WantedBy=multi-user.target

通过命令将我们的脚本添加到systemd系统中,

#读取更新配置
systemctl daemon-reload
#将服务添加到开机自启
systemctl enable date.service
#手动启动服务
systemctl start date.service

手动启动服务后,通过命令systemctl status date.service查看服务启动是否正常,结果如下。

我们的脚本服务已经被启动,并且通过ps -ax命令也能看到脚本被启动。

systemd 启动脚本时的问题_第2张图片

但是,我们在脚本的路径下,没有看到脚本运行的结果,没有新增 data.log 这个文件。这就是我们遇到问题,服务已经启动,但是结果不符合我们的预想。

4、问题引入&解决

通过查找资料,得到如下解答;解答中的关键信息有: /$HOMEWorkingDirectory=

systemd 启动脚本时的问题_第3张图片

4.1、WorkingDirectory=

WorkingDirectory= 是*.service文件中的一个配置项,我们先修改配置文件如下,增加WorkingDirectory=配置项

[Unit]
Description=start shell

[Service]
Type=simple
WorkingDirectory=/home/work/shell #增加工作目录配置
ExecStart=/home/work/shell/systemd.sh 
ExecReload=/home/work/shell/systemd.sh 
Restart=always
RestartSec=10s
User=root

[Install]
WantedBy=multi-user.target

然后更新配置,重启启动服务,查看服务的执行结果:

请添加图片描述

添加 WorkingDirectory配置后我们的脚本运行正常了,但没有解决我们的疑问。

4.2、其它区别

通过搜索其他人使用systemd启动脚本服务成功的案例,发现一个小区别如下:

脚本输出信息时使用的是绝对路径,我们也改写脚本,打印信息使用绝对路径,并去除.service 文件中的WorkingDirectory配置。

echo `date`  >> /tmp/data.log

通过实验,这次脚本无论是手动执行还是使用systemd系统启动,都得到了正确的结果。这种方式给我们接下来的试验提供了便利。

4.3、/$HOME

单一变量原则,我们接下来的使用中去除WorkingDirectory=配置。

解答中提到了 /$HOME,我们来打印一下这两个环境变量,我们修改脚本如下,然后重新启动服务。

#!/bin/bash

while true
do
        echo `date` >> /home/work/shell/data.log
        echo `pwd`  >> /home/work/shell/data.log
        echo $HOME  >> /home/work/shell/data.log
        sleep 10
done

  • 手动执行

我们先手动执行,查看输出结果;

systemd 启动脚本时的问题_第4张图片

我们打印脚本运行时的当前路径信息和当前用户的家目录信息,分别是 /home/work/shell/root,符合预期。

  • systemd执行

接下来我们在使用systemd系统启动同样的脚本,查看输出结果。

systemd 启动脚本时的问题_第5张图片

通过结果对比,我们得知,通过systemd启动的脚本,环境变量中当前路径是 系统根目录。

然后我们回到第一个实验。我们切换路径到系统根目录,在/中看到了脚本执行的结果。

5、结论

通过上面的几个实验结果,我们可以得知:

  1. 在没有设置WorkingDirectory的前提下,systemd启动任何服务的环境变量中,当前路径都是 /;
  2. 可以通过设置WorkingDirectory修改脚本工作的目录;
  3. 没有设置WorkingDirectory时,在脚本中输出信息要使用绝对路径;

6、参考资料

https://askubuntu.com/questions/1387716/script-works-fine-but-systemd-service-to-launch-it-fails-with-status-127

https://unix.stackexchange.com/questions/534041/systemd-init-script-create-working-directory

你可能感兴趣的:(Linux系统,linux,systemd)