前言
今天對前端服務器進行遷移,本來前端服務器就一臺,都是放置前端靜態文件的地方,應該是比較簡單的。唯一的問題是由於Nginx需要給ie8瀏覽器個i同https訪問支持,不得不對Nginx進行重新編譯。編譯完成後想啓動一下服務,才發現沒有systemctl,於是使用service命令,奇怪的是service命令無法居然無法識別nginx服務。經過一番折騰終於解決了問題。
以前這些命令一直是拿來就用,沒什麼深究,只有遇到了問題才知道基礎的重要性。下面就對這些東西做個簡單的記錄。
進程管理工具
Linux進程管理常用的工具有service、systemctl、update-rc.d等。其中越來越多的發行版使用systemctl作爲程序的的管理工具。問題就在於今天我所使用的Ubuntu版本是14.04,也就是還沒有把systemctl作爲默認的軟件啓動管理工具。systemctl是15.0x之後的版本才作爲自帶的進程管理工具的。
SysV/Upstart/systemd是什麼
簡單的說,他們是系統初始化時的第一個進程,也就是pid爲1的進程,可以通過ps -p 1 命令來檢測。
$ ps -p 1
如顯示的數據類似於:
PID TTY TIME CMD
1 ? 00:00:02 systemd
若顯示systemd則爲systemd,顯示init則爲Upstart。
在第一個進程啓動之後,這個進程負責啓動其它設置了開機自啓動的進程。這就帶出了一個概念,這些開機自啓或者不自啓的信息存放在哪裏?
在Ubuntu系統中,通過SysV管理的進程啓動信息放在/etc/init.d/
文件夾中,裏面的文件實際上是一些shell腳本,運行這些腳本就能啓動或停止這些進程。而它對應的管理工具就是update-rc.d
命令。
例如要啓動nginx服務,可以通過sudo update-rc.d nginx enable
實現。
通過Upstart管理的進程啓動信息放在/etc/init
文件夾中,其中都是.conf
後綴的配置文件,與其對應的命令行管理工具是initctl。我們可以通過在/etc/init
中編寫相應的配置文件達到啓動服務的目的。
通過systemd管理的進程啓動信息放在/etc/systemd/system
、 /lib/systemd/system
、/var/lib/systemd
幾個文件夾中,例如通過命令locate nginx.service
就會得到以下的位置信息:
/etc/systemd/system/multi-user.target.wants/nginx.service
/lib/systemd/system/nginx.service
/var/lib/systemd/deb-systemd-helper-enabled/nginx.service.dsh-also
/var/lib/systemd/deb-systemd-helper-enabled/multi-user.target.wants/nginx.service
配套的命令行工具是systemctl
。可以通過命令 sudo systemctl enable nginx.service
將服務加到開機自啓動中。需要注意的是如果不是軟件安裝時生成的.service
文件,而是自己在上述位置寫相應的文件的話,需要使用systemctl daemon-reload
命令重新加載新的腳本才能使用。
另一個有用的命令是service
,它兼容了update-rc.d
和initctl
命令的功能,兩種啓動方式都能使用。常用命令例如service nginx status
。
每臺Linux服務器只能有一個系統初始化軟件,從歷史上說先有SysV,到Upstart,再到systemd。比較新版的Linux發行版很多都以systemd作爲初始化管理軟件。
systemd是在Ubuntu15.04纔開始作爲默認初始化程序的。
參考:
https://www.techforgeek.info/enable_disable_service_on_ubuntu.html
https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1416728
https://segmentfault.com/a/1190000009723940
https://stackoverflow.com/questions/7646972/nginx-invalid-pid-number
https://gist.github.com/AJMaxwell/f6793605068813aae888216b02364d85
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html