Linux啟動過程、守護進程以及其他
系統:ubuntu server 12.04
1、linux啟動過程
2、關於SysV風格的啟動方式
3、運行級別(runlevel)
運行級別0:系統停機狀態,系統默認運行級別不能設為0,否則不能正常啟動
運行級別1:單用戶工作狀態,root權限,用於系統維護,禁止遠程登陸
運行級別2:多用戶狀態(沒有NFS)(Multi-User Mode Without Networking)
運行級別3:完全的多用戶狀態(有NFS),登陸後進入控制台命令行模式
運行級別4:多用戶狀態,系統未使用,保留
運行級別5:X11控制台,登陸後進入圖形GUI模式
運行級別6:系統正常關閉並重啟,默認運行級別不能設為6,否則不能正常啟動
運行級別S :單用戶恢復模式,運行很少進程以及服務
查看當前runlevel: 使用命令rulevel
切換運行級別:init [0123456Ss]
/etc/inittab: ubuntu 12.04中沒有該文件,創建一個即可。在裡面寫入系統啟動後進入的運行級別:id:N:initdefault: 。N是runlevel對應的數值。 相關工具: sysv-rc-conf,update-rc.d,rcconf,chkconfig
4、ubuntu12.04如何啟動到字符界面
ubuntu server 12.04安裝桌面後,每次啟動默認進入lightDM,之後進入桌面環境。查看的runlevel為2,使用inittab文件將啟動的runlevel改為3後仍然會進入桌面。而各個rcN.d文件下也沒有關於LightDM的文件。
方法一:修改內核啟動參數
nano /etc/default/grub
修改
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
為:
GRUB_CMDLINE_LINUX_DEFAULT=” text”
然後運行下sudo update-grub2就可了。
不過在12.04 server中GRUB_CMDLINE_LINUX_DEFAULT的值為空(即"")。而update-grub2命令實際上指向update-grub命令。
方法二:upstart體系
/etc/rcN.d中的文件都是/etc/init.d目錄中文件的軟鏈接,/etc/init.d目錄裡面基本上都是/lib/init/upstart-job文件的軟連接(可以找時間分析下這個文件),upstart系統對啟動項目的管理全部根據/etc/init目錄裡面的配置文件。所以可以修改一下/etc/init/lightdm.conf。 在/etc/init/lightdm.conf中可以看到:
start on ((filesystem
and runlevel [!06]
and started dbus
and (drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1
or stopped udev-fallback-graphics))
or runlevel PREVLEVEL=S)
stop on runlevel [06]
由於把runlevel設置為了3,所以改為:
start on ((filesystem
and runlevel [!036]
and started dbus
and (drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1
or stopped udev-fallback-graphics))
or runlevel PREVLEVEL=S)
stop on runlevel [036]
方法三:/etc/lightdm/users.conf(測試失敗,沒搞懂hidden-users是什麼意思,也可能是該配置文件不起作用)
找到:hidden-users=nobody nobody4 noaccess,改為:hidden-users=sunlt lotte
關於nobody,nobody4,noaccess:
Windows系統在安裝後會自動建立一些用戶帳戶,在Linux系統中同樣有一些用戶帳戶是在系統安裝後就有的,就像Windows系統中的內置帳戶一樣。它 們是用來完成特定任務的,比如nobody和ftp等,我們訪問LinuxSir.Org的網頁程序,就是nobody用戶(相當於Windows系統中 的匿名帳戶);我們匿名訪問ftp時,會用到用戶ftp或nobody。
首先,nobody是一個普通用戶,非特權用戶。 使用nobody用戶名的目的是,使任何人都可以登錄系統,但是其UID(65534)和GID(65534)不提供任何特權,即該uid和gid只能訪問人人皆可讀寫的文件。
其次,許多系統中都按慣例地默認創建一個nobody,盡量限制它的權限至最小,當服務器向外服務時,可能會讓client以nobody的身份登錄。
nobody -- an anonymous user account ,assigned by an NFS server when an unauthorized root user makes a request. The nobody user account is assigned to software processes that do not need any special permissions.
noaccess -- The account assigned to a user or a process that needs access to a system through some application without actually logging into the system.
nobody4 -- SunOS4.0 or 4.1version of the nobody account.
5、如何創建基於rcN.d的守護進程
如何軟連接:
bash >> ln -s tree.txt tree
bash >> ls -l
...
lrwxrwxrwx 1 sunlt sunlt 8 Mar 21 08:19 tree -> tree.txt
-rw-rw-r-- 1 sunlt sunlt 104946 Mar 20 07:19 tree.txt
...
示例1:記錄開關機時間
ubuntu的系統日志一般放在目錄/var/log中。現在制作一個簡單的記錄開關機時間的日志,日志文件為/home/my.log。
文件mylog-halt內容如下:
#!/bin/bash
echo "start" >> /home/my.log
date >> /home/my.log
文件mylog-start內容如下:
#!/bin/bash
echo "halt" >> /home/my.log
date >> /home/my.log
將mylog-start和mylog-halt放入/etc/init.d/目錄中,添加執行權限。自己把這兩個文件軟鏈接到相應的rcN.d目錄或者使用sysv-rc-conf之類的工具。
示例2:一個web服務器 下面是一個簡單的基於python的web server示例py_http.py:
#!/usr/bin/python
from os import curdir,sep
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
content='''
<html><body><h2>hello,kugou!</h2></body></html>
'''
self.send_response(200)
self.send_header('Content-type','text/html')
self.end_headers()
self.wfile.write(content)
def main():
server = HTTPServer(('',8080),MyHandler)
server.serve_forever()
if __name__=='__main__':
main()
按照示例1配置失敗。(繼續努力...) 但是將python /path/to/py_http.py &放入/etc/rc.local文件中成功。
mysql啟動腳本分析
/etc/init.d/mysql是/lib/init/upstart-job的軟鏈接。
6、如何穿創建基於upstart的守護進程
相關命令:service、initctl、update-rc.d、invoke-rc.d
7、關於at
echo touch ~/touch_file | at now + 2 minutes -->兩分鐘後建立/更新文件~/touch_file
echo shutdown -h now | at now + 4 hours -->4小時後關機。
8、關於crontab
查看命令cron、crontab的man文檔,其中 man 5 crontab獲得的內容比 man crontab更加詳細。
9、關於nohup
10、其他方式的開機啟動
桌面程序 進入 ~/.config/autostart 目錄 ,創建以名字加.desktop的文件(一個可執行的shell腳本什麼的應該也可以),類似於application目錄中的文件,如果要只在某種桌面環境下啟動,可以在相應的desktop目錄中添加 OnlyShowIn=<desktop-name>;,例如 OnlyShowIn=KDE;。
其他autostart目錄:
/etc/xdg/autostart
/usr/share/autostart
/usr/share/gdm/autostart
/usr/share/gnome/autostart
~/.config/autostart
~/.kde/share/autostart
~/.local/share/autostart
其他用戶配置文件 如/etc/bash.bashrc,~/.bashrc