1. 前言
添加开机自启程序,一种是图形界面应用程序,一种是文本模式自启动程序。
前者比较简单,在ubuntu的启动应用程序里添加程序路径即可,后面我们还会介绍一种复杂的方法。
后者需要首先设置ubuntu文本模式启动,一种方法是修改 /etc/default/grub 文件,GRUB_CMDLINE_LINUX_DEFAULT 增加 “text” ,然后sudo update-grub,一种方法是禁止lightdm启动,修改 /etc/init/lightdm.conf ,由于ubuntu默认启动级别是2,修改 “and runlevel [!06]” 为 “and runlevel [!026]”,即在运行级别2下不启动lightdm,可通过 /etc/init/rc-sysinit.conf 设置运行级别,在第14行附近,“env DEFAULT_RUNLEVEL=2”,关于这一部分详见 https://blog.csdn.net/jk110333/article/details/17878843
2. 文本模式自启程序的几种方法
1.在/etc/init/目录下添加开机启动程序的方法。该目录下新建文件myrdpclient.conf。将下面的内容拷贝至文件保存即可。
start on login-session-start script /usr/bin/mystartx end script
这样init进程就会启动的时候执行/usr/bin/mystartx。这个目录下的 .conf 文件是供init进程读取的配置文件,每个配置文件的内容包含两个内容,一是一段脚本在告诉init要启动哪个程序,即指定一个job,或者说任务;二是一些标签(如“start on”)表明这个程序在什么时候启停。首先被读取执行的是rc-sysinit.conf。关于具体该如何写一个conf文件来让init在适当的时候运行某个程序请自行搜索,我给出这个配置是个非常简单的配置,如果你需求不多的话,把/usr/bin/mystartx 替换为你的程序就够了。(原作者mystartx修改自/usr/bin/startx,是为了启动图形应用程序,后面第3节会详述,我们当然可以用此方法启动文本程序)
2.在/etc/rc2.d目录下添加开机启动程序的方法。
建立软链接指向想要启动的脚本:
ln -s /usr/bin/mystartx ./S99mystartx
S??其中数字表示启动优先级,不启动则修改为K99mystartx。然后在你的脚本中启动应用程序:
#!/bin/sh
/path/to/your/app
3.在 /etc/rc.local 里添加启动程序,这也是网上大部分文档给出的方法。 /etc/rc.local 是默认启动的最后一个脚本文件,实质上也是通过 /etc/rc?.d 下的软链接启动 /etc/init.d/rc.local ,并最终启动 /etc/rc.local 。在“exit 0”之前写上你的命令。
nohup /path/to/your/app&
nohup是保证程序一直在后台运行,不会随主程序退出而退出。
4.在文件/etc/crontab里添加开机启动程序,编辑该文件,在文件末尾添加一行:
@reboot root /usr/bin/mystartx
这样你的程序会被一个叫 cron 的例程拉起(而不是 init ),实际上,是 init 在启动过程中启动 cron 例程,而 cron 例程通常在系统中做一些定时作业,通过配置也可以让 cron 在启动时做一些作业。
所以,如果你要添加自己的开机启动程序,以上四个地方都可以,其中要大家注意的几点:
1) 前2种方法可能是不稳妥的,因为这两个阶段是系统启动阶段,你添加的程序若对系统某些服务有依赖,将导致你的程序出现错误,比如我的RDPclient会出现段错误。
2) 第3种方法,添加到/etc/rc.local里面,是网上出现最多的答案,这也是我采用的方法。。事实上,rc.local是系统特地为用户提供的一个添加开机启动程序的接口。需要注意的是,并非每个运行级别都会运行rc.local,在ubuntu里只有2,3,4,5运行级别会执行,所以如果运行级别设置不对的话,你写在rc.local里的命令可能就不能如期执行了。如果你对rc.local如何被执行感兴趣的话读下面。实际上运行rc.local是rc2.d目录下所有脚本中的最后一个脚本。接下来证明这点,可以在rc2.d目录下执行命令:ls -l:
S99rc.local -> ../init/rc.local
可以看到,rc2.d目录下的S99rc.local是一个到 /etc/init.d/rc.local 的链接,运行 S99rc.local 就是在运行 /etc/init.d/rc.local ,而打开这个文件发现里面的注释:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
实际上,就是在运行 /etc/rc.local 。所以,执行rc2.d目录下的所有脚本,最后一步,就是执行 /etc/rc.local 。其中的注释同样表明了只有2、3、4、5运行级别会执行rc.local,这是因为,只有在2、3、4、5对应的 /etc/rc?.d 目录才有运行 rc.local 的链接。
在 rc.local 之后,还有添加自启程序的地方。
5. 登录时自动运行程序
用户登录时,bash首先自动执行系统管理员建立的全局登录script :/ect/profile。然后bash在用户目录下按顺序查找三个特殊文件中的一个:/.bash_profile、/.bash_login、 /.profile,但只执行最先找到的一个。
因此,只需根据实际需要在上述文件中加入命令就可以实现用户登录时自动运行某些程序(类似于DOS下的Autoexec.bat)。
6. 退出登录时自动运行程序
退出登录时,bash自动执行个人的退出登录脚本/.bash_logout。例如,在/.bash_logout中加入命令“tar -cvzf c.source.tgz *.c”,则在每次退出登录时自动执行 “tar” 命令备份 *.c 文件。