<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Systemd on Quietbo</title><link>https://quietbo.com/tags/systemd/</link><description>Recent content in Systemd on Quietbo</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Wed, 27 Jul 2022 07:33:45 +0000</lastBuildDate><atom:link href="https://quietbo.com/tags/systemd/index.xml" rel="self" type="application/rss+xml"/><item><title>[Linux] 建立自訂 Systemd 服務教學與範例(Python)</title><link>https://quietbo.com/2022/07/27/linux-%E5%BB%BA%E7%AB%8B%E8%87%AA%E8%A8%82-systemd-%E6%9C%8D%E5%8B%99%E6%95%99%E5%AD%B8%E8%88%87%E7%AF%84%E4%BE%8Bpython/</link><pubDate>Wed, 27 Jul 2022 07:33:45 +0000</pubDate><guid>https://quietbo.com/2022/07/27/linux-%E5%BB%BA%E7%AB%8B%E8%87%AA%E8%A8%82-systemd-%E6%9C%8D%E5%8B%99%E6%95%99%E5%AD%B8%E8%88%87%E7%AF%84%E4%BE%8Bpython/</guid><description>&lt;p&gt;&lt;a class="link" href="https://blog.gtwang.org/linux/linux-create-systemd-service-unit-for-python-echo-server-tutorial-examples/" target="_blank" rel="noopener"
 &gt;Linux 建立自訂 Systemd 服務教學與範例&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="部屬方式"&gt;部屬方式
&lt;/h1&gt;&lt;p&gt;本次範例程式使用FastAPI,&lt;br&gt;
檔名為main.py&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="python" class="language-python line-numbers"&gt;import platform
import os
os_type = platform.system()
if os_type == 'Linux':
 # print('in Linux')
 os.chdir('/home/ubuntu/Dev')
import sys
sys.path.append("/home/ubuntu/.local/lib/python3.8/site-packages")
from fastapi import FastAPI
import uvicorn


app = FastAPI()

@app.get("/")
async def root():
 return {"message": "Hello World"}

if __name__ == "__main__":
 uvicorn.run("main:app", host='0.0.0.0', port=8080, workers=1, reload=True)&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id="linux-建立自訂-systemd-服務教學與範例"&gt;Linux 建立自訂 Systemd 服務教學與範例
&lt;/h1&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 到/etc建立或rc.local並輸入下列內容(如果沒有的話自行建立)
 &lt;/li&gt;
&lt;/ol&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 更改檔案路徑
 &lt;/li&gt;
 &lt;li&gt;
 python執行檔路徑, 有些是/bin/python, 請自行更改(若想包成docker就寫執行docker容器的指令)
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;#!/bin/sh -e

cd /home/ubuntu/Dev/myPython

/usr/bin/python3 main.py

exit 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;確定輸入的python路徑正確, 使程式正常運行:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ /usr/bin/python3 data_collector_main.py&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然後將執行權限添加到 /etc/rc.local 文件。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo chmod +x /etc/rc.local&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 到/etc/systemd/system建立rc-local.service服務
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ nano /etc/systemd/system/rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是依照rc.local則直接複製下方內容,無須修正&lt;br&gt;
(有修改過rc.local檔名的話, 請自行將下方的4處修改為自己的檔名, 分別為下方的1,4,9,17行)&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash line-numbers"&gt;[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
Environment="DJANGO_SETTINGS_MODULE=Macdonald_Server.settings.production"
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

[Install]
WantedBy=multi-user.target
Alias=rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="3"&gt;
 &lt;li&gt;
 python的庫位置
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ pip3 show fastapi&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="4"&gt;
 &lt;li&gt;
 添加PATH, 路徑請自行更改
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ export PATH=$PATH:/home/nadi_19/.local/lib/python3.6/site-packages&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="5"&gt;
 &lt;li&gt;
 開啟執行權限
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ chmod +x /home/nadi_19/NADI/ShowCase/server_ms_showcase/data_collector/data_collector_main.py&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="6"&gt;
 &lt;li&gt;
 重新載入 Systemd 設定檔
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl daemon-reload&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="7"&gt;
 &lt;li&gt;
 啟動自訂的 echo 伺服器
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl start rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="8"&gt;
 &lt;li&gt;
 查看 echo 伺服器狀態
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl status rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成功啟動訊息如下:&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;root@ShowCase19-1:/home/nadi_19/NADI/ShowCase/server_ms_showcase/data_collector# systemctl status rc-local
● rc-local.service - /etc/rc.local Compatibility
 Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)
 Drop-In: /lib/systemd/system/rc-local.service.d
 └─debian.conf
 Active: active (exited) since Wed 2022-07-20 11:15:40 UTC; 1min 27s ago
 Docs: man:systemd-rc-local-generator(8)
 Process: 31493 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="9"&gt;
 &lt;li&gt;
 使服務能夠在啟動時自動啟動
 &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl enable rc-local.service&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;輸入完後重新開機, 測試看看是否service都有自己run起來!&lt;/p&gt;
&lt;ol class="wp-block-list" start="10"&gt;
 &lt;li&gt;
 指令補充
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下方的service-name都是指rc-local.service這隻檔案。&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 檢視服務的當前狀態&lt;br /&gt;無論它是否正在執行，都可以在終端中使用以下命令語法：
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl status [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 啟動服務，請使用以下語法
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl start [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 停止正在執行的服務
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl stop [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 使服務能夠在機器啟動時自動啟動
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl enable [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 禁用服務，使其無法在啟動時自動啟動：
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl disable [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 重新載入服務
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ systemctl reload [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 重新載入&lt;br /&gt;或重新啟動服務（它重新載入服務，並且如果重新載入不可用，那麼它將重新啟動服務。）
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl reload-or-restart [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 檢查服務是否啟用
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl is-active [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;服務正常並啟用則返回:activating&lt;/p&gt;
&lt;ul class="wp-block-list"&gt;
 &lt;li&gt;
 檢查是否已啟用服務以在系統啟動時自動啟動
 &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo systemctl is-enabled [service-name]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;啟用則返回:enabled&lt;/p&gt;
&lt;h2 id="補充"&gt;補充
&lt;/h2&gt;&lt;ol class="wp-block-list"&gt;
 &lt;li&gt;
 若是出現Condition check resulted in /etc/rc.local Compatibility being skipped.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;將執行權限添加到 /etc/rc.local 文件。&lt;/p&gt;
&lt;pre class="wp-block-code"&gt;&lt;code lang="bash" class="language-bash"&gt;$ sudo chmod +x /etc/rc.local&lt;/code&gt;&lt;/pre&gt;
&lt;ol class="wp-block-list" start="2"&gt;
 &lt;li&gt;
 找不到xxx.local檔案&lt;br /&gt;如果在確認etc是否有xxx.local,如果沒有的話請將自己補上, 或是.service檔案內的xx.local檔名打錯了。
 &lt;/li&gt;
 &lt;li&gt;
 執行多個service&lt;br /&gt;目前是建立多個xx.local和xx-local.service,&lt;br /&gt;未來若有更好的方式, 我會來修正現在的方式(如果我有記得的話)
 &lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>