rc.loacl指定非root用戶啟動指令(linux) 基於Systemd的rc.local配置(Centos7) 以及 crontab方式@reboot xxx-command


rc.loacl指定非root用戶啟動指令(linux) 基於Systemd的rc.local配置(Centos7) 以及 crontab方式@reboot xxx-command
20180926 Chenxin
起因:
之前已經賦權755給rc.local文件,但發現開機啟動的時候,centos7(systemd模式)只是將rc.local文件里的systemctl start xxx的成功啟動了(只有apache和jenkins).
而其他的比如redis,mysql等服務均沒有啟動成功(在messages文件里可以看到啟動成功的信息,但之后貌似自己就消失了).
懷疑是/etc/rc.local文件,沒有在末尾 exit 0 原因.
開機時的messages文件如下:
Sep 26 12:09:51 MiWiFi-R3P-srv systemd: Starting /etc/rc.d/rc.local Compatibility... #開始啟動rc.local
Sep 26 12:09:51 MiWiFi-R3P-srv systemd: Starting OpenSSH server daemon...
...
Sep 26 12:09:52 MiWiFi-R3P-srv rc.local: 1277:C 26 Sep 12:09:52.273 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
Sep 26 12:09:52 MiWiFi-R3P-srv rc.local: 1277:C 26 Sep 12:09:52.274 # Redis version=4.0.10, bits=64, commit=00000000, modified=0, pid=1277, just started
Sep 26 12:09:52 MiWiFi-R3P-srv rc.local: 1277:C 26 Sep 12:09:52.274 # Configuration loaded #這里已經啟動了redis,但最終卻沒有redis進程
...
Sep 26 12:09:55 MiWiFi-R3P-srv jenkins: Starting Jenkins [ OK ] #啟動Jenkins
Sep 26 12:09:55 MiWiFi-R3P-srv systemd: Started LSB: Jenkins Automation Server. #完成啟動Jenkins
Sep 26 12:09:56 MiWiFi-R3P-srv rc.local: Starting MySQL.... SUCCESS! #啟動了mysql
Sep 26 12:09:56 MiWiFi-R3P-srv systemd: Starting The Apache HTTP Server... #啟動apache
Sep 26 12:09:57 MiWiFi-R3P-srv systemd: Started The Apache HTTP Server. #完成啟動apache
Sep 26 12:09:57 MiWiFi-R3P-srv rc.local: No suitable Java Virtual Machine could be found on your system. #這里好像是報錯
Sep 26 12:09:57 MiWiFi-R3P-srv rc.local: The version of the JVM must be at least 1.8 and at most 1.8.
Sep 26 12:09:57 MiWiFi-R3P-srv rc.local: Please define INSTALL4J_JAVA_HOME to point to a suitable JVM.
Sep 26 12:09:57 MiWiFi-R3P-srv systemd: rc-local.service: control process exited, code=exited status=83 #以下都是rc.lcoal失敗提示
Sep 26 12:09:59 MiWiFi-R3P-srv systemd: Failed to start /etc/rc.d/rc.local Compatibility.
Sep 26 12:09:59 MiWiFi-R3P-srv systemd: Unit rc-local.service entered failed state.
Sep 26 12:09:59 MiWiFi-R3P-srv systemd: rc-local.service failed.

rc-local.service文件
系統上有2個rc-local.service文件
diff /lib/systemd/system/rc-local.service /usr/lib/systemd/system/rc-local.service 2個文件完全相同.修改的話,改/usr下的.

[root@MiWiFi-R3P-srv ~]# cat /usr/lib/systemd/system/rc-local.service

This file is part of systemd.

This unit gets pulled automatically into multi-user.target by

systemd-rc-local-generator if /etc/rc.d/rc.local is executable.

[Unit]
Description=/etc/rc.d/rc.local Compatibility
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes

[Install] #新加入部分.[Install]為新增內容,"multi-user.target"代表init3,"graphical.target"代表5
WantedBy=multi-user.target

rc.local文件
編輯/etc/rc.local文件.
[root@MiWiFi-R3P-srv ~]# cat /etc/rc.local

!/bin/bash

THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES

touch /var/lock/subsys/local

source /etc/profile
/usr/local/svn/bin/svnserve -d -r /svn-data/svn-new
/usr/local/redis/src/redis-server /usr/local/redis/redis.conf
/usr/local/mysql/support-files/mysql.server start
/bin/systemctl start httpd.service
/bin/systemctl start jenkins
sudo -u xbzj /other-data/nexus/nexus-3.12.1-01/bin/nexus start
exit 0 #新加入部分(不知道是否有用,未驗證)

擴展說明: 指定非root用戶執行開機啟動方法
su - admin -c "ps axfu"
sudo -u admin ps axfu 或 sudo -u admin -s ps axfu

賦權
[root@MiWiFi-R3P-srv ~]# chmod 755 /etc/rc.local #這里可能是個軟連接 /etc/rc.local -> rc.d/rc.local

創建rc.local服務
[root@MiWiFi-R3P-srv system]# systemctl enable rc-local
Created symlink from /etc/systemd/system/multi-user.target.wants/rc-local.service to /usr/lib/systemd/system/rc-local.service. #在rc-local.service文件里需要[Install],才會生成該軟連接.

首次當場啟動rc.local
systemctl start rc-local #啟動rc.local里服務(當場啟動)
systemctl status rc-local #查看剛剛手動啟動后的狀態或報錯等信息(抓取/var/log/messages內容),或 systemctl status rc-local.service
[root@MiWiFi-R3P-srv system]# systemctl status rc-local
rc-local.service - /etc/rc.d/rc.local Compatibility
Loaded: loaded (/usr/lib/systemd/system/rc-local.service; enabled; vendor preset: disabled)
Active: active (exited) (Result: exit-code) since Wed 2018-09-26 17:41:26 CST; 26min ago
Main PID: 8373 (code=exited, status=1/FAILURE) ...
驗證
reboot服務器加以驗證是否正確(此步驟暫未驗證).
20181008 機器重啟,驗證生效.

擴展知識
cron方式的開機自動啟動
注意@reboot xxx-command, 所以寫 rc.local 的東西, 也可以使用 @reboot 寫在 crontab 里面.用這個方式設計服務器開機自啟.

@reboot Run once, at startup. #這個可以用於reboot后,自動運行一次
@yearly Run once a year, “0 0 1 1 *”每年一次,同 @annually (same as @yearly)
@monthly Run once a month, “0 0 1 * *”每月
@weekly Run once a week, “0 0 * * 0” 每周
@daily Run once a day, “0 0 * * *”每天一次,同 @midnight (same as @daily)
@hourly Run once an hour, “0 * * * *”每小時.如@hourly /usr/local/awstats.sh #使用@hourly對應的是 0 * * * * 每個小時運行一次

自定義systemd服務
systemctl腳本存放在:/usr/lib/systemd/
有系統system和用戶user之分.開機就能運行的程序,存在system里,即/usr/lib/systemd/system/.
服務以.service結尾,一般會分為3部分:[Unit] [Service] [Install]

以啟動tomcat項目為例:
/usr/lib/systemd/system/tomcat.service

[Unit] #[Unit]部分主要是對這個服務的說明,包括Description和After
Description=tomcatapi #Description用於描述服務
After=network.target #After用於描述服務類別

[Service] #[Service]部分是服務的關鍵,是服務的一些具體運行參數的設置.注意,這里的啟動/重啟/停止命令全部要求使用絕對路徑,使用相對路徑則會報錯.
Type=forking #后台運行的形式
PIDFile=/usr/local/tomcat/tomcat.pid #存放PID的文件路徑
ExecStart=/usr/local/tomcat/bin/startup.sh #服務的運行命令
ExecReload= #重啟命令
ExecStop=/usr/local/tomcat/bin/shutdown.sh #停止命令
PrivateTmp=true #表示給服務分配獨立的臨時空間

[Install] #服務安裝的相關設置
WantedBy=multi-user.target #設置為多用戶的

服務腳本編寫完成后,以754的權限保存在/usr/lib/systemd/system目錄下(系統里默認很多都是644),這時就可以利用systemctl進行測試了.

服務加入開機自啟動:systemctl enable tomcat

systemd常用指令
參考: http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

systemctl status
systemctl list-units
systemctl list-units --type=service

列出正在運行的 Unit

$ systemctl list-units

列出所有Unit,包括沒有找到配置文件的或者啟動失敗的

$ systemctl list-units --all

列出所有沒有運行的 Unit

$ systemctl list-units --all --state=inactive

列出所有加載失敗的 Unit

$ systemctl list-units --failed

列出所有正在運行的、類型為 service 的 Unit

$ systemctl list-units --type=service

顯示某個 Unit 是否正在運行

$ systemctl is-active application.service

顯示某個 Unit 是否處於啟動失敗狀態

$ systemctl is-failed application.service

顯示某個 Unit 服務是否建立了啟動鏈接

$ systemctl is-enabled application.service

每一個 Unit 都有一個配置文件,告訴 Systemd 怎么啟動這個 Unit 。
Systemd 默認從目錄/etc/systemd/system/讀取配置文件。但是,里面存放的大部分文件都是符號鏈接,指向目錄/usr/lib/systemd/system/,真正的配置文件存放在那個目錄。
systemctl enable命令用於在上面兩個目錄之間,建立符號鏈接關系。
$ systemctl enable clamd@scan.service

等同於

$ ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'
如果配置文件里面設置了開機啟動,systemctl enable命令相當於激活開機啟動。
與之對應的,systemctl disable命令用於在兩個目錄之間,撤銷符號鏈接關系,相當於撤銷開機啟動。
$ systemctl disable clamd@scan.service
配置文件的后綴名,就是該 Unit 的種類,比如sshd.socket。如果省略,Systemd 默認后綴名為.service,所以sshd會被理解成sshd.service。

systemctl list-unit-files命令用於列出所有配置文件。

systemctl cat命令可以查看配置文件的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM