一、前言
@H_403_4@无论你想要在ubuntu 12.04(11.10适用)开机启动图形程序,或者非图形程序,相信这篇文章能帮上大忙。 @H_403_4@我将根据我的需求讲解我的做法,并解释为什么这么做。完了以后,各位看官根据自己的需求不加修改或稍加修改即可适用。我这边,总得来说,需求是做一个RDP瘦客户端,在一个板子上装上ubuntu 12.04,然后要这个系统启动后能立即弹出RDPclient登录框,而不是进入ubuntu的图形桌面。 @H_403_4@二,三部分讲解我是怎么做的,四部分总结设置程序为开机启动的方法,五部分主要针对需要把图形界面程序弄成开机启动的同学,讲解startx。 @H_403_4@第六部分为后来补充的:如何关闭ubuntu的启动时载入画面(“loading screen”)。 @H_403_4@二、阻止默认图形桌面启动
@H_403_4@ubuntu 12.04默认的开机会进入一个图形界面,用命令pstree可以看到图形界面所在的进程树:三、设置自己的程序为开机启动
@H_403_4@阻止了lightdm的启动之后,还要做的就是把我的RDPClient设置为开机启动。做法: @H_403_4@一、在目录/usr/bin下,有个文件startx,在当前目录复制出一份来,命名为mystartx(cp startx mystartx)。编辑mystartx,在文件末尾有一行“xinit "$client" $clientargs -- "$server" $display $serverargs”,在这一行的前面加入一行"client="/root//myRdpClient/myRdpClient.py"。 @H_403_4@二、编辑文件/etc/rc.local,在"exit 0"前添加一行:/usr/bin/mystartx。 @H_403_4@解释:第一步里,我制作了一个启动RDPClient的脚本,第二步里,我把这个脚本设置为开机启动。制作RDPClient或其他图形应用程序的启动脚本请看本文的第五部分,第四部分讲解开机启动的方法和注意事项。 @H_403_4@四、添加开机启动程序的方法及其注意事项
对于开机启动程序,需要关注4个地方(排序有分先后):1.目录 /etc/init/ 下的所有conf都会被init进程首先执行。2.运行级别为2的时候,目录 /etc/rc2.d/ 下的所有脚本会其次执行,其他运行级别雷同。3.文件/etc/rc.local里的命令会得到执行。4.在文件/etc/crontab里面配置为@reboot的命令会得到执行。
以下分别讲解每个地方该怎么做。
@H_403_4@1.在/etc/init/目录下添加开机启动程序的方法。该目录下新建文件myrdpclient.conf。将下面的内容拷贝至文件保存即可。
@H_403_4@start on login-session-start
@H_403_4@script
@H_403_4@ /usr/bin/mystartxend script
@H_403_4@这样init进程就会启动的时候执行/usr/bin/mystartx。之前我解释运行级别(runlevel)的时候,说这个目录下的是脚本,是不想在那个地方废话。其实,这个目录下的 .conf 文件是供init进程读取的配置文件,每个配置文件的内容包含两个内容,一是一段脚本在告诉init要启动哪个程序,即指定一个job,或者说任务;二是一些标签(如“start on”)表明这个程序在什么时候启停。首先被读取执行的是rc-sysinit.conf。关于具体该如何写一个conf文件来让init在适当的时候运行某个程序请自行搜索,我给出个这个配置是个非常简单的配置,如果你需求不多的话,把/usr/bin/mystartx 替换为你的程序就够了。 @H_403_4@2.在/etc/rc2.d目录下添加开机启动程序的方法。执行命令: @H_403_4@ln -s /usr/bin/mystartx ./S99mystartx @H_403_4@这个命令将会该目录下建立一个指向/usr/bin/mystartx 的链接,这样init在启动时就会执行这个链接指向的命令。那个S99打头的命名规则,我其实不清楚其意义是什么,大约是在标明启动优先级。总之,你只需要将/usr/bin/mystartx替换为你想要执行的命令(你的程序),同时链接的名字以"S99"为前缀即可。 @H_403_4@3.在/etc/rc.local文件里添加启动程序,在“exit 0”之前写上你的命令就可以了,我正是这么做的。 @H_403_4@4.在文件/etc/crontab里添加开机启动程序,编辑该文件,在文件末尾添加一行: @H_403_4@@reboot root /usr/bin/mystartx
@H_403_4@这样你的程序会被一个叫 cron 的例程拉起(而不是 init ),实际上,是 init 在启动过程中启动啦 cron 例程,而 cron 例程通常在系统中做一些定时作业,通过配置也可以让 cron 在启动时做一些作业。 @H_403_4@ @H_403_4@ @H_403_4@
@H_403_4@所以,如果你要添加自己的开机启动程序,以上四个地方都可以,其中要大家注意的几点: @H_403_4@一、前两种方法可能是不稳妥的,因为这两个阶段是系统启动阶段,你添加的程序若对系统某些服务有依赖,将导致你的程序出现错误,比如我的RDPclient会出现段错误。 @H_403_4@二、第三种方法,添加到/etc/rc.local里面,是网上出现最多的答案,这也是我采用的方法。。事实上,rc.local是系统特地为用户提供的一个添加开机启动程序的接口。需要注意的是,并非每个运行级别都会运行rc.local,在ubuntu里只有2,5运行级别会执行,所以如果运行级别设置不对的话,你写在rc.local里的命令可能就不能如期执行了。如果你对rc.local如何被执行感兴趣的话读下面。实际上运行rc.local是rc2.d目录下所有脚本中的最后一个脚本。接下来证明这点,可以在rc2.d目录下执行命令:ls -l: @H_403_4@S99rc.local -> ../init/rc.local @H_403_4@可以看到,rc2.d目录下的S99rc.local是一个到 /etc/init.d/rc.local 的链接,运行 S99rc.local 就是在运行 /etc/init.d/rc.local ,而打开这个文件发现里面的注释: @H_403_4@# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist @H_403_4@实际上,就是在运行 /etc/rc.local 。所以,执行rc2.d目录下的所有脚本,最后一步,就是执行 /etc/rc.local 。其中的注释同样表明了只有2、3、4、5运行级别会执行rc.local,这是因为,只有在2、3、4、5对应的 /etc/rc?.d 目录才有运行 rc.local 的链接。
@H_403_4@