systemd 启动脚本时的问题

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

1、测试环境

ubuntu 16.04 32位

2、测试脚本

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

#!/bin/bash

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

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

请添加图片描述

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命令也能看到脚本被启动。

请添加图片描述

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

4、问题引入&解决

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

请添加图片描述

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

  • 手动执行

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

请添加图片描述

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

  • systemd执行

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

请添加图片描述

通过结果对比,我们得知,通过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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: systemd 是一个系统和服务管理器,它可以用来管理系统启动流程。 当系统启动systemd 会执行以下流程: 1. 引导加载程序(如 GRUB)将内核和 initramfs 加载到内存中。 2. 内核将控制权交给 init 进程。 3. init 进程读取配置文件 /etc/inittab,并根据配置文件中指定的运行级别,执行相应的初始化任务。 4. 在运行级别为 5(图形界面),init 进程会启动 systemd,并由它来继续管理系统的启动流程。 5. systemd 会执行所有基本系统服务(basic system services)和用户服务(user services)。这些服务由配置文件(以 .service 结尾)指定,并且可以被用户自定义。 6. 当所有基本系统服务和用户服务都已启动,系统就完成了启动流程,并进入了正常的工作状态。 希望我的回答对你有帮助! ### 回答2: systemd是一个系统和服务管理器,是大多数现代Linux发行版的默认初始化系统。它负责管理整个系统的启动过程和各种系统服务的管理。 systemd启动流程如下: 1. 引导加载:当计算机开机,引导加载程序(如GRUB)会引导Linux内核的加载。在此过程中,系统启动会加载systemd引导加载器。 2. 内核初始化:Linux内核被加载后,会进行一系列的初始化操作,包括设置硬件、内存管理等。同,内核还会启动systemd进程,将系统初始化的责任交给systemd。 3. Target设置:systemd会根据预设的目标(target)进行进一步的初始化。目标是一组预定义的运行级别,它们定义了系统应该启动哪些服务。比如,graphical.target表示图形界面模式,multi-user.target表示多用户模式等。系统会根据当前目标来启动相应的服务。 4. 控制台登录:在目标设置后,systemd启动控制台登录服务tyetty,提供一个控制台界面供用户登录。 5. 系统服务启动systemd根据配置文件和目标设置,逐个启动各种系统服务。这些服务可以是网络服务、文件系统服务、打印服务等等。systemd通过配置文件来确定哪些服务应该在启动启动,以及它们之间的依赖关系。 6. 用户服务启动:除了系统服务,systemd还会启动用户级别的服务。这些服务是由每个用户自定义和管理的,比如自启动应用程序、定任务等。 7. 启动完成:一旦所有服务启动完成,系统进入正常运行状态。 总而言之,systemd启动流程可以简单概括为引导加载、内核初始化、目标设置、控制台登录、系统服务启动和用户服务启动。它通过预定义的目标和配置文件来控制系统的初始化过程,实现了系统和服务的并行启动,提高了系统启动的效率。 ### 回答3: systemd是一种用于启动和管理Linux系统服务的初始化系统,其启动流程如下: 1. 内核引导:当计算机启动,首先加载内核。内核负责启动系统和硬件初始化。 2. systemd引导:接下来,内核启动systemd程序。systemd是第一个用户空间程序,它会接管系统的控制权。 3. 启动目标:systemd会加载配置文件,决定启动哪些服务和目标。目标是一组预定义的系统状态,比如multi-user.target表示多用户运行级别(类似于传统的运行级别3)。 4. 依赖解析:systemd会分析服务之间的依赖关系。每个服务都有关于它所依赖的其他服务和被依赖的信息。systemd会根据这些依赖关系确定启动顺序。 5. 启动服务:一旦依赖关系解析完毕,systemd会按照正确的顺序启动服务。每个服务都有自己的启动脚本(称为服务单元),systemd会执行这些脚本。 6. 并行启动systemd具有并行启动的能力,可以同启动多个服务,提高启动速度。 7. 启动后事件:一旦所有服务都成功启动systemd会触发启动后事件,并通知其他程序系统已准备就绪。 总结来说,systemd启动流程包括内核引导、systemd引导、启动目标、依赖解析、启动服务、并行启动启动后事件。它通过优化依赖关系、并行启动和分级启动等功能,提高了系统启动的效率和可靠性。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值