Ubuntu 18.04中以root身份开机运行Bash脚本失败求助
我来帮你解决Ubuntu 18.04下开机以root身份运行Bash脚本的问题——既然rc.local和crontab都没成功,那咱们试试systemd服务,这是Ubuntu 18.04这类systemd发行版的标准玩法,可靠性比前两者高不少。
这是最稳妥的方案,毕竟Ubuntu 18.04默认用systemd当初始化系统,rc.local属于兼容模式容易踩坑,crontab的@reboot又经常受环境变量限制。
步骤1:先把你的脚本准备好
确保脚本有可执行权限,而且开头必须加shebang(告诉系统用什么解释器运行):
# 给脚本加执行权限 chmod +x /path/to/your/script.sh
脚本第一行要写:
#!/bin/bash
步骤2:创建systemd服务配置文件
在/etc/systemd/system/目录下新建一个服务文件,比如叫my-boot-script.service:
sudo nano /etc/systemd/system/my-boot-script.service
把下面的内容粘进去,记得替换成你自己的脚本路径:
[Unit] Description=开机自动运行我的自定义脚本 After=network.target # 如果你的脚本需要网络就保留,不需要的话换成basic.target或者删掉 [Service] Type=oneshot ExecStart=/path/to/your/script.sh User=root # 明确指定以root身份运行 RemainAfterExit=yes # 标记服务已完成,哪怕脚本执行完了 [Install] WantedBy=multi-user.target
简单解释下关键参数:
Type=oneshot:说明脚本只需要执行一次,适合开机一次性任务User=root:直接指定用root权限跑,不用再额外提权After=network.target:保证脚本在网络启动后再执行,避免脚本依赖网络但网络还没好的情况
步骤3:启用并测试服务
# 重新加载systemd的配置,让新服务生效 sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable my-boot-script.service # 先手动运行一次,测试脚本能不能正常工作 sudo systemctl start my-boot-script.service
想看执行状态的话,用systemctl status my-boot-script.service就能看到有没有成功。
关于rc.local
Ubuntu 18.04的rc.local默认是没启用的,得手动开:
sudo systemctl enable rc-local.service
而且rc.local脚本必须以exit 0结尾,本身还要有可执行权限。另外它的执行时机很早,可能某些系统资源还没准备好,导致脚本跑失败。
关于crontab @reboot
用@reboot的时候,crontab的环境变量和root正常登录的环境不一样,很多常用命令的路径(比如/usr/local/bin)可能不在PATH里,导致脚本里的命令找不到。解决办法要么在脚本里写命令的绝对路径,要么在crontab里指定PATH:
# 编辑root的crontab sudo crontab -e
添加一行:
@reboot /bin/bash /path/to/your/script.sh
或者带环境变量的版本:
@reboot PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin /path/to/your/script.sh
但就算这样,crontab的@reboot有时候会因为系统启动顺序问题,比你脚本依赖的服务先启动,照样会失败。
优先选systemd服务的方式,它能明确控制执行时机和权限,出问题了也方便排查。如果非要用rc.local或者crontab,记得先检查启用状态和环境变量的问题。
内容的提问来源于stack exchange,提问作者Sujikanth

