deepin中实现开机脚本自启的三种方法

deepin中实现开机脚本自启的三种方法

使用 deepin 也有一段时间了,但之前一直不知道如何去实现用户自定义脚本开机自启。曾在自己管理的一台的 ubuntu 服务器上实现了 frp 服务开机自启,方法是先在 /etc/init.d 目录下增加 frp 客户端脚本,再通过 update-rc.d frp defaults 95 命令将该脚本添加到系统初始化执行队列中。很遗憾,我在 deepin 下也同样测试了这种方法,但似乎是没什么效果(也有可能是自己的食用方法不对而导致脚本无法开机自启,感兴趣的同学可以自己研究下)。

关于脚本开机自启这个话题,论坛中也有很多 精彩的讨论 。如果你曾在论坛中看到过相关的帖子应该会知道在 deepin 中实现用户自定义脚本开机自启主要是有三种方法(修改.profile文件、新建rc.local文件以及将desktop文件拖进.config/autostart文件夹下实现开机自启)。在这篇文章中我主要介绍的是前两种方法。

修改 ~/.profile 文件

第一种方法是把开机需要自动执行的命令直接写入 .profile 文件中。严格来说,这不能够算是开机自启脚本,它的原理其实是当用户登录系统后会自动执行该脚本(也就是登录后触发)。这种方法有三个较大的缺点,首先是一旦脚本有报错或输出警告信息那么用户登录系统后会出现黑屏弹框,从而严重影响开机体验;其次是我们不能在 ~/.profile 文件中用 sleep 命令,比如说当你在 .profile 文件中使用了 sleep 5,那么当你开机登录系统后会真的黑屏5s后再进入桌面;最后一个缺点是执行该脚本的用户是普通用户而不是 root 用户,这就意味着当你的命令含有 sudo 前缀时,你需要采用 hack 方式去执行该条命令,如:

1
echo "your password" | sudo -S some command # 输出用户密码并作为下一条命令的输入

鉴于上面三个缺点,我个人并不是很建议使用第一种方法。

新建 /etc/rc.local 文件

本文的标题本来是准备起名叫《谈谈 deepin 中的 rc.local 文件》的,但考虑到将这个方法与其它方法比较能够给其他人更多的参考信息,于是乎就改了标题又多写了点。实际上,我用这种方法时还是踩了比较多的坑的(因此有点东西可写)。这种方法的原理是系统开机后会自动启动 rc-local 服务,rc-local 服务启动后就会自动执行 /etc 目录下的 rc.local 脚本。该方法的优点就是不存在第一种方法的三个缺点,脚本执行失败不会出现黑屏弹窗、sleep 不会造成开机黑屏以及执行脚本的用户是 root 用户。

先介绍一下利用 rc.local 文件实现脚本开机自启的主要步骤:

主要步骤

  1. 新建 /etc/rc.local 文件
  2. 粘贴以下模板

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    exit 0

  3. exit 0 上方插入你需要自启的命令(一行一个)后保存文件
  4. 给脚本加上 755 权限

    1
    sudo chmod +755 /etc/rc.local

  5. 调试脚本(可选)

    1
    sudo /etc/rc.local # 使用 sudo 模拟 root 用户开机自启 /etc/rc.local 文件

如果第 5 步模拟启动脚本没有报错,那我们就可以重启电脑看看是否可以成功实现脚本开机自启。重启进入系统后我们可以通过 systemctl status rc-local.service 查看 rc-local 的运行状态,如果结果显示的是 active (exited) 则说明你的脚本已经成功执行,反之如果结果显示 failed,那么你需要检查一下脚本是否哪里有问题。

这里提供几个可能导致脚本无法正常启动的原因:

可能导致脚本无法执行的原因

1. 执行脚本的用户不一致

由于 rc.local 开机自启的时候是以 root 用户执行的,这里很多人会忽略了一个问题,很多情况下你的命令是必须要普通用户执行的。比如 conky 和虚拟机(用户A建立的VBox和VM Ware虚拟机用户B无法访问)等。

假设用户 lolimay 在终端用 VBoxHeadless -s aikuai & 后台启动了虚拟机名 aikuai,那么我们在 rc.local 文件应该用下面这种方式写:

1
su - lolimay -c "VBoxHeadless -s aikuai &" # 以 lolimay 用户执行该命令

2. 多余的 sudo

前面已经提到 rc.local 开机时是以 root 用户启动的,所以写在 rc.local 文件中命令不需要带有 sudo 前缀(实际上就算你带有了 sudo 前缀也不会产生错误)。

最佳实践

个人建议每当往 rc.local 文件中添加了一个需要自启的命令时,可以先用 sudo /etc/rc.local 命令模拟一下看看是否能够执行成功(如果执行失败也能够直观地看到出错的原因),这样能够有效减少你重启电脑来调试的次数。

~/.config/autostart 文件夹

第三种方法是新建一个 .desktop 文件,然后把它丢进 ~/.config/autostart 文件夹下。~/.config/autostart 文件夹其实挺类似于 Windows 下的启动文件夹,系统开机时会执行该文件夹下的每个 desktop 文件 Exec 参数指向的脚本或可执行文件(desktop你可以简单地理解为 Windows 系统中的快捷方式,更多介绍请看 这个)。一个最简单的 desktop 文件模板如下:

1
2
3
4
5
[Desktop Entry]
Name=<应用程序名>
Type=Application
Exec=<应用程序或脚本完整路径>
Icon=<应用程序图标的完整路径>

最后,需要注意的一点是这种方法的执行脚本的用户也是普通用户,所以当脚本中出现 sudo 命令是,需要用类似于 echo "your password" | sudo -S some command 的 hack 方法去实现开机自启需要管理员权限的命令。

参考链接

  1. 想加入几个开机自启动
  2. deepin linux15如何开机自启动一个shell脚本?