Ubuntu上用systemctl實現隨機啓動

Ubuntu上用systemctl實現隨機啓動

零 概述

在Ubuntu 16.04 LTS中,/etc/init.d已被/usr/lib/systemd所取代(貌似15.04就已經轉用了)。腳本仍然可以啓動和停用服務。但默認用的命令現在是’systemctl’。而不是chkconfig命令.當然你可以自己安裝chkconfig命令,來支持舊配置。換方之,Ubuntu 16.04 LTS中已經默認不安裝chkconfig了。所以本文會更關注systemctl的使用。systemctl使用步驟上主要分如下幾步:

  1. 編寫擴展名爲service的配置文件(下面假設配置文件名爲:servicectrl.service)
  2. 把配置文件放入/lib/systemd/system/目錄
  3. 加載服務的配置文件:sudo systemctl daemon-reload
  4. 手動啓動服務:sudo systemctl start servicectrl.service
  5. 手動關閉服務:sudo systemctl stop servicectrl.service
  6. 設置開機啓動服務:sudo systemctl enable servicectrl.service
  7. 取消開機啓動服務:sudo systemctl disable servicectrl.service

參考:
數個配置例子
https://www.300168.com/yunwei/show-7884.html

詳細的配置項說明
https://www.freedesktop.org/software/systemd/man/systemd.service.html

一 編寫擴展名爲service的配置文件

配置文件的命名格式爲:【文件名常與服務名相同】.service
即除了要求擴展名爲service.其他沒有特別要求.不過爲了方便通常我們會把配置文件名設爲需要啓動的程序名.因爲我們這裏用於演示的程序文件名爲servicectrl.所以配置文件名就成了:servicectrl.service

配置文件的編寫實質也很簡.下面是一個簡化版的配置(經測試可用):

[Unit]
Description=servicectrl
After=network.target

[Service]
Type=forking
ExecStart=/home/hgits/work/project/ThirdParty/trunk/source/HGServiceFW/HGServiceFW/Output/servicectrl -s
ExecStop=/home/hgits/work/project/ThirdParty/trunk/source/HGServiceFW/HGServiceFW/Output/servicectrl -t

[Install]
WantedBy=multi-user.target

上面配置的內容中,實質只需要關注ExecStart及ExecStop這兩個配置項即可.
ExecStart : 用於設置啓動程序的命令
ExecStop : 用於設置關閉程序的命令
這兩個配置項都可以設置爲一個shell腳本的路徑.

二 把配置文件放入/lib/systemd/system/目錄

要注意/lib/systemd/system/是受保護目錄.所以需要sudo或root權限纔可以修改.

三 加載服務的配置文件

使用如下命令完成加載
sudo systemctl daemon-reload
另外對/lib/systemd/system/中的配置文件進行修改後,也需要用這個命令重新加載,要不然你修改的配置不會立即生效.

四 手動開/關服務

使用如下命令完成手動 啓動
sudo systemctl start servicectrl.service

使用如下命令完成動手動 關閉
sudo systemctl stop servicectrl.service

五 設置及取消開機啓動服務

使用如下命令設置開機啓動服務
sudo systemctl enable servicectrl.service

使用如下命令取消開機啓動服務
sudo systemctl disable servicectrl.service

六 啓動服務失敗的成因

在這裏插入圖片描述
如上圖服務啓動失敗,啓動用的命令是:

sudo systemctl status servicectrl.service

查到的結果.其中"status=127"本來是指帳戶或帳戶權限有問題,造成啓動失敗.如下有一些資料:
https://bugs.freedesktop.org/show_bug.cgi?id=71578

但我遇到的不是帳戶問題.我的情況是:
成因爲,因爲自定義的環境變量沒有生效,目標程序的依賴的動態庫沒有找到,所以出問題.解決方法, 把程序依賴的所有動態庫複製到程序所在目錄.

七 權限問題

在CentOS7上遇到該問題:用rc.local設置開機啓動,及用systemctl設置的開機啓動的程序都啓動子進程。在QT上的表現爲調用QProcess時,start後老是等到超時都沒有輸出。注意是超時,不是start失敗。 解決方法是:

sudo chmod 777 /etc/rc.d/rc.local  或 
sudo chmod 777 /etc/systemd/system/[服務名].service

八 systemctl環境變量問題

在CentOS7上遇到該問題:我自己在profile中設置的環境變量,在開機啓動的程序中訪問不到。這時需要在 /etc/systemd/system.conf 中加入默認環境變量,如下是一些例子(文件尾追加)。

DefaultEnvironment="STD_SDK_HOME=/home/hgits/installed/STD_SDK/"
DefaultEnvironment="STD_BOOST_HOME=/usr/local/include/"
DefaultEnvironment="LD_LIBRARY_PATH=/home/hgits/installed/STD_SDK/lib:/home/hgits/installed/STD_SDK/bin:/usr/local/include/lib:/usr/local/include/bin"

當我們自己添加系統服務時,也可以在/etc/systemd/system/myservice.service.d中以.conf結尾的文件(一般來說是override.conf,可以直接用systemctl edit mysevice打開)中爲需要啓動的服務進程指定環境變量,語法爲Environment=,或者EnvironmentFile=,後一種方法會指定環境變量文件,適合需要設置比較多的環境變量的情況。

九 小結

本文主要說述systemctl設置開機啓動的方法.並給出了一個最簡單的可用配置示例.其對於設置隨機啓動已經足夠.但本文還沒有涉及一些常用的配置項說明.例如:PIDFile及User,這些常用配置項的說明,會另起文章進行說明.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章