deepin中实现脚本开机自启的三种方法
Tofloor
poster avatar
14******[email protected]
deepin
2018-10-15 08:46
Author
本帖最后由 lolimay 于 2018-10-15 08:04 编辑

阅读原文体验更佳 http://www.lolimay.cn/2018/10/14/autostart-in-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 方式去执行该条命令,如:
echo "your password" | sudo -S some command # 输出用户密码并作为下一条命令的输入

鉴于上面三个缺点,我个人并不是很建议使用第一种方法。
新建 /etc/rc.local 文件
本文的标题本来是准备起名叫《谈谈 deepin 中的 rc.local 文件》的,但考虑到将这个方法与其它方法比较能够给其他人更多的参考信息,于是乎就改了标题又多写了点。实际上,我用这种方法时还是踩了比较多的坑的(因此有点东西可写)。这种方法的原理是系统开机后会自动启动 rc-local 服务,rc-local 服务启动后就会自动执行 /etc 目录下的 rc.local 脚本。该方法的优点就是不存在第一种方法的三个缺点,脚本执行失败不会出现黑屏弹窗、sleep 不会造成开机黑屏以及执行脚本的用户是 root 用户。
先介绍一下利用 rc.local 文件实现脚本开机自启的主要步骤:
主要步骤
  • 新建 /etc/rc.local 文件
  • 粘贴以下模板
    #!/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
  • 在 exit 0 上方插入你需要自启的命令(一行一个)后保存文件
  • 给脚本加上 755 权限
    sudo chmod +755 /etc/rc.local
  • 调试脚本(可选)
    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 文件应该用下面这种方式写:
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 文件模板如下:
[Desktop Entry]
Name=<应用程序名>
Type=Application
Exec=<应用程序或脚本完整路径>
Icon=<应用程序图标的完整路径>
最后,需要注意的一点是这种方法的执行脚本的用户也是普通用户,所以当脚本中出现 sudo 命令是,需要用类似于 echo "your password" | sudo -S some command 的 hack 方法去实现开机自启需要管理员权限的命令。
参考链接
Reply Favorite View the author
All Replies
wtz
deepin
2018-10-15 10:41
#1
总结得很好,建议加入精华~
https://bbs.deepin.org/user/101846
Reply View the author
绿竹
deepin
2018-10-15 16:12
#2
原创好帖子,加分鼓励,收藏了
Reply View the author
aida
deepin
2018-10-16 17:16
#3
加精鼓励!!! 原创威武!
Reply View the author
pikachuhy
deepin
2018-10-16 17:35
#4
赞                                    
Reply View the author
海天鹰
deepin
2018-10-16 22:13
#5
我的换壁纸shell在终端运行正常,放入desktop就出错了
Reply View the author
JadeHua
deepin
2018-11-16 18:22
#6
我觉得对于像我这样的新手来说,修改 ~/.profile 文件更稳妥
Reply View the author
JadeHua
deepin
2018-11-16 18:25
#7
https://bbs.deepin.org/post/169824
我的换壁纸shell在终端运行正常,放入desktop就出错了

你可以在desktop里加一行Terminal=true试试
Reply View the author
许自强
deepin
Ecological co-builder
2018-11-16 18:32
#8
https://bbs.deepin.org/post/169824
我的换壁纸shell在终端运行正常,放入desktop就出错了

可能是桌面还没有准备好
Reply View the author
许自强
deepin
Ecological co-builder
2018-11-16 18:34
#9
本帖最后由 hyikesong 于 2018-11-16 16:32 编辑

frp失败可能是刚开机网络没准备好,我之前也试过(输出的日志隐约记得是网络的问题)。后来我通过用自动任务定期检查frpc进程来实现的。分析:
1. 服务端设置自启动成功,因为服务器的frps只需要监听端口,
2. 而我们本地的frpc是需要主动请求代理服务器的,所以必须要网络(frpc它也不等待,没网络就直接失败了。)


恩,我觉得分析得很对

Reply View the author
14******[email protected]
deepin
2018-11-16 22:01
#10
https://bbs.deepin.org/post/169824
frp失败可能是刚开机网络没准备好,我之前也试过(输出的日志隐约记得是网络的问题)。后来我通过用自动任 ...

恩 deepin 开机本地连接的速度有待提升
Reply View the author
许自强
deepin
Ecological co-builder
2018-11-16 22:06
#11
https://bbs.deepin.org/post/169824
恩 deepin 开机本地连接的速度有待提升

这个吧,是启动frpc的时机不对,需要在联网的情况下才可以启动。如果你的笔记本处于一个没网的环境,怎么快也没用
Reply View the author
14******[email protected]
deepin
2018-11-16 22:08
#12
https://bbs.deepin.org/post/169824
这个吧,是启动frpc的时机不对,需要在联网的情况下才可以启动。如果你的笔记本处于一个没网的环境,怎么 ...

然而同样的自启脚本在我的ubuntu服务器上是可以的,并没有任何多余的配置
Reply View the author
许自强
deepin
Ecological co-builder
2018-11-17 00:32
#13
https://bbs.deepin.org/post/169824
然而同样的自启脚本在我的ubuntu服务器上是可以的,并没有任何多余的配置 ...

你的Ubuntu服务器是跑的frps还是frpc?
Reply View the author
14******[email protected]
deepin
2018-11-17 11:48
#14
https://bbs.deepin.org/post/169824
你的Ubuntu服务器是跑的frps还是frpc?

frpc
Reply View the author
许自强
deepin
Ecological co-builder
2018-11-17 18:30
#15

Ubuntu是不是跑在虚拟机的啊
Reply View the author
千年诚
deepin
2019-07-10 02:27
#16
结合一下内容和文中提到第二种办法,配置deepin开机启动vnc,实测15.10.2版可用
---------------------
参考略修改
原文:https://blog.csdn.net/a727911438/article/details/80418708
Reply View the author
千年诚
deepin
2019-07-10 02:28
#17
https://bbs.deepin.org/post/169824
结合一下内容和文中提到第二种办法,配置deepin开机启动vnc,实测15.10.2版可用
---------------------
参 ...

#!/bin/sh -e
x11vnc -auth guess -once -loop -noxdamage -repeat -rfbauth /root/.vnc/passwd -rfbport 5900 -alwaysshared
exit 0
Reply View the author
suanyun
deepin
2022-11-12 18:03
#18

不错!必须点赞!

Reply View the author