centos7.6編寫自己的啟動服務,運行systemctl后卡住了的解決方案


問題:centos7.6編寫自己的啟動服務,運行systemctl后卡住了,表現為當我執行systemctl命令后shell阻塞在那里,沒有像平時執行命令那樣自動結束(只能自己按Ctrl+C強制結束),情況如下:

強制結束后,查看程序發現目標程序啟動是成功的, 但狀態為activating (start)而不是activating (running)態

 sdcd.service服務代碼如下

[Unit]
Description=sdcd
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/sdcd-web/start.sh start
ExecReload=/usr/local/sdcd-web/start.sh reload
ExecStop=/usr/local/sdcd-web/start.sh stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

解決方法:
導致此問題的原因是sdcd.service類型選擇有問題, 不應該選forking類型;類型改為Type=simple(或刪除Type=forking這句),問題便得到解決。

正確代碼如下:

[Unit]
Description=sdcd
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/sdcd-web/start.sh start
ExecReload=/usr/local/sdcd-web/start.sh reload
ExecStop=/usr/local/sdcd-web/start.sh stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

 

出現這個問題的可能原因,先看看type的種類和解釋:

Type=oneshot 這一選項適用於只執行一項任務、隨后立即退出的服務。可能需要同時設置 RemainAfterExit=yes 使得 systemd 在服務進程退出之后仍然認為服務處於激活狀態。

Type=notify 與 Type=simple 相同,但約定服務會在就緒后向 systemd 發送一個信號。這一通知的實現由 libsystemd-daemon.so 提供。

Type=dbus 若以此方式啟動,當指定的 BusName 出現在DBus系統總線上時,systemd認為服務就緒。

Type=idle systemd會等待所有任務處理完成后,才開始執行 idle 類型的單元。其他行為與 Type=simple 類似。

Type=forking systemd認為當該服務進程fork,且父進程退出后服務啟動成功。對於常規的守護進程(daemon),除非你確定此啟動方式無法滿足需求,使用此類型啟動即可。使用此啟動類型應同時指定 PIDFile=,以便 systemd 能夠跟蹤服務的主進程

Type=simple (默認值) systemd認為該服務將立即啟動。服務進程不會 fork 。如果該服務要啟動其他服務,不要使用此類型啟動,除非該服務是socket 激活型。

 

原因分析:

當類型為forking時,systemd會認為所運行當該服務本身是守護進程即本身會fork,且只有父進程退出后systemd才會退出,但由於參考例子並不是守護進程,故systemd一直處於阻塞等待狀態,默認的simple無等待這一環節。如果是simple或是不填,則systemctl認為這是一般的應用程序,只要啟動就能保證成功,而不會去檢查對應的服務是否真的執行成功。

 

Type:定義啟動時的進程行為。它有以下幾種值。
Type=simple:默認值,執行ExecStart指定的命令,啟動主進程
Type=forking:以 fork 方式從父進程創建子進程,創建后父進程會立即退出
Type=oneshot:一次性進程,Systemd 會等當前服務退出,再繼續往下執行
Type=dbus:當前服務通過D-Bus啟動
Type=notify:當前服務啟動完畢,會通知Systemd,再繼續往下執行
Type=idle:若有其他任務執行完畢,當前服務才會運行

 

另外要注意的是一旦修改自啟服務配置文件,就要讓 SystemD 重新加載配置文件,然后重新啟動,否則修改不會生效。命令為systemctl daemon-reload


免責聲明!

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



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