文章目录

  • Ubuntu开机自启动程序的方法
  • 目标效果
  • 方案1:修改rc.local
  • 测试结果
  • 方案2:单独增加一个开机启动的脚本
  • 错误1
  • 错误2
  • 实测结果
  • refs
  • 方案3:利用官方快捷方式启动


Ubuntu开机自启动程序的方法

目标效果

开机运行写好的脚本文件,启动terminal,执行ros及相关桌面程序

gnome-terminal -x bash -c “roscore; exec bash;”

方案1:修改rc.local

编辑/etc/rc.local文件完成此功能,在exit 0 之前写入要执行的代码即可。可以加入如下代码片段,方便查看执行情况

#log
    exec 2> /tmp/rc.local.log  # send stderr from rc.local to a log file  
    exec 1>&2                  # send stdout to the same log file  
    set -x                     # tell sh to display commands before execution

开机后,在/tmp/rc.local.log文件中可以看到该文件执行的具体信息

测试结果

可以运行到这个脚本,但运行不了terminal.

方案2:单独增加一个开机启动的脚本

etc/init.d/文件夹下,可以看到很多脚本,最好任意打开一个作为参照仿写。

cd /etc/init.d/
    sudo touch new.sh #这个文件夹好像不需要sudo权限

先尝试脚本能不能正常运行,可能会遇到以下错误:

错误1

insserv: script new.sh is not an executable regular file, skipped!
    # 需要给权限
    sudo chmod +x /etc/init.d/new.sh

错误2

insserv: warning: script 'xxxx' missing LSB tags and overrides
insserv: Starting nifi depends on plymouth and therefore on system facility `$all' which can not be true!

需要仿照其它文件,加上说明头:

### BEGIN INIT INFO
# Provides:          scriptname
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

继续操作,设定更新,具体可以查看开头的参考文章,90是执行顺序

sudo update-rc.d new.sh defaults 90

理论上,这样更新rc-d之后,会生成S90开头的软链接,但我操作完生成的软链接都是S01开头的…尴尬…
移除上面生成的软链接:

sudo update-rc.d -f new.sh remove

实测结果

与方法1是同样的,在这个级别启动时,桌面尚未启动,运行不了terminal.

refs

关于Ubuntu运行级别、开机启动脚本的说明

设置Linux自启服务以及优先级,这一篇讲的很复杂,照着做的时候做到创建软链接

sudo ln -vsf /etc/init.d/proxyserver S98proxyserver

不知道是不是我没有-vsf,系统提示我不能这样创建,就停在这里了。

方案3:利用官方快捷方式启动

将写好的脚本赋予权限后,在左上角搜startup applications,出来对话框后,直接增加一个,在command里面输入要运行的脚本文件路径即可。

这种方式适合启动桌面程序,执行优先级最低

找不到的话,命令行运行也可以起到同样的效果:

gnome-session-properties