8 开机启动脚本_在 Ubuntu 上使用 systemd 配置开机执行脚本

本文详细介绍了如何在 Ubuntu 上利用 systemd 配置开机启动脚本,包括创建可执行脚本、配置 service 文件、手动测试服务以及针对 Nextcloud 服务的特殊配置,旨在实现开机自动执行特定任务,减少手动操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简述

在配置自用服务器时,经常需要在开机后启动某些服务。人工登录后手动启动服务肯定可行,但本文希望节省人工干预的时间。省出来的时间可以用来陪家人、学习、锻炼身体,也可以用来发呆、睡觉,反正就不要花时间进行重复的机械性操作。

为此,本文使用 systemd 配置的方式让 Ubuntu 系统在开机且未登录的的状态下执行特定的 Shell 脚本。

本文原为《基于加密的 RAID-1 硬盘阵列搭建 Nextcloud 私有网络硬盘服务》文章中阐述配置开机启动 Nextcloud 服务的章节,因配置开机执行脚本的方法具有通用的参考价值,故另起本文详述。

systemd

systemd 可以看作是 Linux 系统下的服务管理者,已被应用到很多主流的 Linux 发行版中(如 Ubuntu, Debian, Fedora 等)用于系统管理。如在 Ubuntu 20.04 上用命令行关机,可直接使用如下 systemd 提供的命令:

sudo systemctl poweroff

本文选取 systemd 实现开机执行 Shell 脚本有两个原因:

  1. 配置方法简便。
  2. systemd 已被 Linux 发行版广泛采用,使用 systemd 在开机时执行脚本可以认为是一种官方建议做法。

通用操作步骤

  • 创建希望开机马上执行的脚本,本文举例脚本存放位置为 /home/tqh/Documents/Example/StartupScipt.sh,脚本内容如下:
#!/bin/sh
# 开机时在脚本的同级目录下创建一个名为 StartupTouch.txt 的文件
touch /home/tqh/Documents/Example/StartupTouch.txt
  • 开机执行的脚本需增加可执行权限才能被 systemd 运行,使用如下命令
chmod u+x /home/tqh/Documents/Example/StartupScipt.sh
chmod g+x /home/tqh/Documents/Example/StartupScipt.sh
  • 进入 systemd 放置 service 的目录,在该目录下可看到大量服务配置文件,命令如下
# 进入 systemd 的 service 目录
cd /etc/systemd/system
# 查看文件列表
ls -al
  • 在该目录创建一个新的 .service 文件用于配置开机启动脚本,本例中的文件名为 StartupExample.service,所执行命令和文件中的配置内容如下:
# 创建服务配置文件
sudo touch /etc/systemd/system/StartupExample.service

# 以下为 StartupExample.service 配置文件的内容
[Unit]
Description=Startup Example

[Service]
ExecStart=/home/tqh/Documents/Example/StartupScipt.sh

[Install]
WantedBy=multi-user.target
  • 尝试手动运行新创建的 service,使用如下命令:
# 手动运行 StartupExample.service
sudo systemctl start StartupExample.service
# 查看运行日志
systemctl status StartupExample.service

c528bbf1db84bd956a03cd2ad0740b30.png
运行日志显示:服务启动成功
  • 查看服务中创建的文件是否创建成功,使用如下命令:
ls -al /home/tqh/Documents/Example/

c96a9f561c25a4cca13fda6783b5823f.png
文件创建成功,证明服务配置已生效
  • 删除文件后将服务设置为 enable 状态,再重启计算机,看服务是否能正常运行。使用如下命令:
# 删除刚测试服务时创建的文件
rm -f /home/tqh/Documents/Example/StartupTouch.txt
# 设置服务为 enable 状态,使之能开机运行
sudo systemctl enable StartupExample.service
# 重启机器
systemctl reboot
  • 下图中能看到开机运行的脚本中 touch 的文件已经创建成功

04a5d44f7a07c1f8683078d0f02db1f1.png
文件创建成功,证明开机运行的脚本已配置完成

启动 Nextcloud 服务的操作步骤

本章将对《基于加密的 RAID-1 硬盘阵列搭建 Nextcloud 私有网络硬盘服务》一文中配置开机启动 Nextcloud 服务的部分进行细述,除用到上述通用的操作步骤外,还有特殊情况需要讨论处理。

  • 创建启动 Nextcloud 服务的脚本并为之增加可运行权限,操作如下
# 创建开机启动 Nextcloud 的脚本
touch /mnt/data/nextcloud/start_nextcloud.sh

# 为脚本增加可执行权限
chmod u+x /mnt/data/nextcloud/start_nextcloud.sh
chmod g+x /mnt/data/nextcloud/start_nextcloud.sh
  • 编辑脚本内容如下
#!/bin/sh

docker run -d  
-p 8080:80 
-v /mnt/data/nextcloud/data:/var/www/html 
nextcloud
  • 在 /etc/systemd/system 目录下新建服务描述文件 Nextcloud.service,操作及文件内容如下
# 创建 systemd 使用的 service 描述文件
sudo touch /etc/systemd/system/Nextcloud.service

# 以下为 Nextcloud.service 的文件内容
[Unit]
Description=Nextcloud Service

[Service]
ExecStart=/mnt/data/nextcloud/start_nextcloud.sh

[Install]
WantedBy=multi-user.target
  • 设置 Nextcloud.service 为开机启动并重启计算机,操作如下
# 设置 Nextcloud.service 为开机启动
sudo systemctl enable Nextcloud.service
# 重启机器
sudo systemctl reboot
  • 重启后查看运行日志,所执行命令及其结果如下
# 查看 systemd 的运行日志
systemctl status Nextcloud.service

87ab0a13d58c9a787a7ebc8da95423c6.png
执行失败:找不到脚本文件
根据日志中的报错信息,发现开机后 systemd 要执行 Nextcloud.service 时找不到脚本。结合该文中加密硬盘阵列分区的使用方法,可疑的原因是启动服务时脚本所在的硬盘分区未挂载完成
解决的思路是等待分区挂载完成再执行启动 Nextcloud 服务的脚本。
  • 先找到挂载 /mnt/data 的服务,使用命令和运行结果如下
systemctl list-unit-files

413d15035474afa31380b642b89e8ab7.png
在 systemd 的 UNIT 列表中找到了 mnt-data.mount 的挂载操作
  • 使用文本工具修改 Nextcloud.service 文件,增加语句 “ After=mnt-data.mount ”保证硬盘分区的挂载操作先执行,修改后的文件如下
[Unit]
Description=Nextcloud Service
After=mnt-data.mount

[Service]
ExecStart=/mnt/data/nextcloud/start_nextcloud.sh

[Install]
WantedBy=multi-user.target
  • 重启计算机后查看 systemd 执行日志,使用命令和运行结果如下
# 重启机器
sudo systemctl reboot
# 查看 systemd 的运行日志
systemctl status Nextcloud.service

e2173ad3df8cd5b5681243934093f18a.png
Nextcloud.service 启动成功

至此, 开机启动 Nextcloud 服务的配置操作已经完成。

附语

有很多特殊原因可能导致使用通用的 systemd 配置开机启动脚本方法时失败,建议使用 systemd 的 status 命令查看日志以定位问题。

systemctl status ***.service
<think>好的,我现在需要帮助用户解决systemd服务无法在开机时自启动的问题。用户已经提供了相关的引用资料,我需要先仔细理解这些资料,然后结合自己的知识来给出解决方案。 首先,用户提到他们按照引用[2]配置systemd服务,但服务没有在开机时自启动。可能的原因有很多,我需要逐一排查。根据引用[3],systemdUbuntu 18.04默认的进程管理器,取代了initd。所以用户应该是在使用systemd的系统上配置的。接下来,引用[2]中提到了使用systemctl命令来启用服务,用户可能已经执行了systemctl enable,但服务仍然没有启动。可能的问题可能出在服务单元的配置文件中,比如依赖关系、执行路径、权限等问题。 根据引用[4],服务启动时会执行指定的脚本,用户需要确保脚本中的命令正确,并且环境变量设置正确。此外,引用[5]提到了SysVinit和systemd的区别,用户可能混淆了两种机制,但这里主要是systemd的问题,所以需要检查服务单元文件的正确性。 接下来,我需要按照步骤来排查问题: 第一步,检查服务单元文件的位置和权限是否正确。根据systemd的要求,单元文件应该放在/etc/systemd/system/目录下,权限应该是644,确保systemd能够读取。 第二步,验证服务是否已正确启用。使用systemctl is-enabled命令查看服务是否设为enabled。如果未启用,需要重新执行enable命令,并重新加载systemd配置。 第三步,检查服务单元文件的内容是否正确。比如,ExecStart路径是否正确,是否使用绝对路径,是否有必要的依赖如After=network.target等。另外,如果服务需要其他服务先启动,可能需要添加Requires或Wants指令。 第四步,查看启动日志。使用journalctl -u服务名 -b来查看启动过程中的日志,可能会显示错误信息,比如脚本执行失败、权限问题等。 第五步,检查脚本本身的权限和可执行性。如果启动脚本没有执行权限,或者脚本内部命令路径不正确,都会导致启动失败。同时,脚本中的环境变量设置是否正确,如引用[4]中的例子,是否正确导出了需要的变量。 第六步,测试手动启动服务。如果手动启动失败,那说明服务单元或脚本本身存在问题,需要先解决手动启动的问题,再处理自启动的问题。 第七步,检查冲突或依赖问题。比如服务可能被其他服务阻止,或者依赖的服务未能正确启动。可能需要调整服务单元的依赖顺序。 最后,考虑系统启动顺序的影响,比如是否需要等待网络或文件系统挂载完成。可以添加After=network.target等指令来确保依赖就绪。 用户可能需要逐步执行这些步骤,逐一排除问题。比如,首先检查单元文件的位置和内容是否正确,然后检查脚本是否可执行,再查看日志中的错误信息。如果手动启动成功但开机启动,可能问题出在依赖或启动顺序上。此外,确保没有其他服务或配置覆盖了该服务的启用状态。</think>### Systemd服务开机启动配置与故障排查 若systemd服务配置后未按预期自启动,请按以下步骤排查和解决: --- #### **1. 检查服务单元文件配置** - **文件位置**:确保服务单元文件(`.service`)位于`/etc/systemd/system/`目录下,例如`/etc/systemd/system/my_service.service`[^3]。 - **文件权限**:权限需为`644`,命令: ```bash sudo chmod 644 /etc/systemd/system/my_service.service ``` - **关键配置项**: ```ini [Unit] Description=服务描述 After=network.target # 确保依赖项(如网络就绪)已正确设置[^2] [Service] ExecStart=/绝对路径/启动脚本.sh # 必须使用绝对路径[^4] Restart=on-failure # 失败时自动重启 [Install] WantedBy=multi-user.target # 指定启动级别 ``` --- #### **2. 验证服务启用状态** - 执行命令启用服务: ```bash sudo systemctl enable my_service ``` - 检查是否成功启用: ```bash systemctl is-enabled my_service # 应返回"enabled" ``` 若未启用,重新加载配置: ```bash sudo systemctl daemon-reload ``` --- #### **3. 排查启动脚本问题** - **脚本权限**:确保启动脚本有可执行权限: ```bash chmod +x /路径/启动脚本.sh ``` - **脚本内容**:检查脚本中的命令路径是否正确,尤其是环境变量(如`export`语句)[^4]。 示例脚本: ```sh #!/bin/sh export QT_QPA_PLATFORM=eglfs # 确保环境变量正确设置 /usr/bin/my_program ``` --- #### **4. 查看服务启动日志** - 通过日志定位错误: ```bash journalctl -u my_service -b # 查看本次启动日志 journalctl -xe # 查看详细日志 ``` 常见错误: - 路径错误(如相对路径或未找到命令) - 权限不足(如脚本未以root权限运行) - 依赖服务未就绪(如未设置`After=network.target`) --- #### **5. 测试手动启动服务** - 手动启动服务验证功能: ```bash sudo systemctl start my_service sudo systemctl status my_service # 检查状态是否"active (running)"[^2] ``` - 若手动启动失败,需优先修复脚本配置问题。 --- #### **6. 检查依赖冲突** - **依赖顺序**:在`[Unit]`段中添加`Requires`或`After`,确保依赖服务已启动: ```ini After=network.target mysql.service ``` - **冲突服务**:检查是否有其他服务占用相同端口或资源。 --- #### **7. 处理特殊场景** - **延迟启动**:若服务需等待其他资源(如磁盘挂载),添加: ```ini ExecStartPre=/bin/sleep 10 ``` - **用户权限**:在`[Service]`段指定运行用户: ```ini User=myuser Group=mygroup ``` --- ### 总结解决方案 1. 验证服务单元文件语法和路径。 2. 确保服务已正确启用(`systemctl enable`)。 3. 通过日志定位具体错误(`journalctl`)。 4. 修复脚本权限、路径或依赖问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值