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
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