ubuntu设置开机自启程序

1. 前言

添加开机自启程序,一种是图形界面应用程序,一种是文本模式自启动程序。

前者比较简单,用ubuntu自带功能启动应用程序添加启动项即可,后面我们还会介绍一种利用xinit的方法。另外利用启动应用程序还可以按如下格式添加命令:

gnome-terminal -x /path/to/your/script

打开一个终端执行脚本。

后者需要首先设置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. 文本模式自启程序的几种方法

文本模式自动登录,参考 http://www.aizhuanji.com/a/Bxvpm2BV.html

对于开机启动程序,需要关注4个地方(排序有分先后):1.目录 /etc/init/ 下的所有conf都会被init进程首先执行。2.运行级别为2的时候,目录 /etc/rc2.d/ 下的所有脚本会其次执行,其他运行级别雷同。3.文件/etc/rc.local里的命令会得到执行。4.在文件/etc/crontab里面配置为@reboot的命令会得到执行。
以下分别讲解每个地方该怎么做。

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。或直接使用命令update-rc.d xxx defaults NN(NN为启动顺序)

然后在你的脚本中启动应用程序:

#!/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 /usr/bin/mystartx&

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 文件。

7. 可用一些小工具来管理 Ubuntu 的启动选项:

小工具 :rcconf.

功能更全的工具:sysv-rc-conf.

3. 图形界面应用程序自启动

不同于用启动应用程序工具添加的启动项,在ubuntu图形桌面启动后再启动,该方法是开机启动图形应用程序,替换默认图形桌面,所以首先禁止lightdm启动。

在目录/usr/bin下,有个文件startx,在当前目录复制出一份来,命名为mystartx(cp startx mystartx)。编辑mystartx,在文件末尾有一行

xinit "$client" $clientargs -- "$server" $display $serverargs

在这一行的前面加入一行

client="/root/myRdpClient/myRdpClient.py 

有了mystartx,就可以用前面提到的各种方法来自启动了。

对于要开机启动非图形界面的同学来说,事情是非常简单的,在rc.local里添加你的命令即可(或者使用第四部分的其他方法)。之前的阻止lightdm启动你都不需要做,做了也无妨。(经验证,必须阻止lightdm启动,否则系统启动完成后黑屏,应用程序也没有运行。)至于运行级别,你没动过的话应该是2,是ok的。

对于要启动图形化界面的同学,要知道为什么我在startx里面添加一行,设置为开机启动,同时屏蔽lightdm的启动,就可以达到目的,可能还需要进一步的说明。

在linux里,要运行图形界面,需要同时有 X server(或者叫X11 server,"11"是当前的版本号), 和X client,这是 x windows 工作的模式(据说以后会改成wayland什么的,那是后话)。X server在目录 /etc/X11 下,X server启动后的进程名字叫 Xorg ,如果你的系统启动了图形桌面。那么运行命令 pstree 一定可以看到Xorg,正如我在第一部分的贴图里显示,在那里,Xorg 是被 lightdm 拉起来的。

所以,如果ubuntu系统要跑图形程序,不管是它的默认图形桌面lightdm,还是我的RDPClient,都必须先启动 X server(Xorg),再启动图形程序作为X client。没有修改过的ubuntu的图形桌面就是这样启动的,从图中你可以看到它先启动了Xorg,再启动了自己的一大堆metacity什么的。那么,我现在阻止了lightdm的启动,要运行RDPCLient,也同样要分两步:一、启动X server,二、启动RDPClient(作为X client)。

这看起来真难,因为我其实也不知道如何启动X server。但是在 /usr/bin 下有一个脚本叫 startx 。这个脚本是个历史遗留脚本,在过去的ubuntu,或者现在某些其发行版本linux,是这个脚本负责启动默认的图形桌面的。它会做两件事,一、启动X11server,二,启动图形桌面作为 X client。我可以拿这个脚本稍作修改,替换掉其中的图形桌面为我的RDPClient就可以了,具体做法在第二部分。

为什么我不修改lightdm.conf来达到目的?lightdm也是做了两件事,不是也可以替换它的X client为我的X client就可以了么?也许这样是可以的,但是,lightdm.conf那个脚本,哥们儿,你去看看吧,我反正下不了手。反观startx,startx的启动逻辑是非常清晰的,它通过执行了一个 xinit 命令来同时启动X server 和 X client,建议你使用命令“man xinit” 查看xinit的相关内容。修改startx来达到目的比较容易,这就是为什么我不修改lightdm。

总结,阻止lightdm启动默认桌面,通过修改startx来制作一个脚本mystartx以启动X server和我的RDPClient,把mystartx搞成开机启动。这是这样!

参考资料:

https://blog.csdn.net/dlutxie/article/details/8633721

https://sites.google.com/site/yunluliussite/linux-shell/autostart

posted @ 2018-05-23 14:44  armme  阅读(3707)  评论(0编辑  收藏  举报