Ubuntu 19.10 系統設置開機自啓動腳本(frpc內網穿透服務)

這個問題我搞了一天多(加上寫shell腳本一些錯誤和運行權限的問題)

總結經驗:查找問題的時候注意解決方法的時間!!!我近乎把網上能找到的方法都試了一遍,就登錄自啓動那個方法依然是有效的,到了最後,突然靈機一動發現是版本的問題,才找到了方法。

原因:ubuntu 16.10 開始不再使用 initd 管理系統,改用 systemd …
所以在 Ubuntu 19 系統不能像其它 Ubuntu 16 一樣採用編輯 rc.local 文件來設置開機啓動腳本
解決方案:

一、通過如下設置來使 rc.local 文件可用:

systemd 默認讀取 /etc/systemd/system 下的配置文件,該目錄下的文件會鏈接 /lib/systemd/system/ 下的文件,先看看有沒有 /etc/systemd/system/rc-local.service 文件, 沒有就創建一個,然後輸入如下代碼,保存

#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.
[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
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

[Install]  
WantedBy=multi-user.target  
Alias=rc-local.service

簡單介紹一下配置文件的意思

[Unit] 段: 啓動順序與依賴關係
[Service] 段: 啓動行爲,如何啓動,啓動類型
[Install] 段: 定義如何安裝這個配置文件,即怎樣做到開機啓動

Ubuntu 19.10 默認是沒有 /etc/rc.local 這個文件的,需要自己創建一下

sudo touch /etc/rc.local

記得 rc.local腳本首行一定要添加:

#!/bin/sh -e
#rc.local
#然後就在裏面寫自己的shell腳本了,可以重定向到日誌文件,方便查看服務啓動有沒有正常
echo "服務啓動成功" > /usr/local/rc.log
exit 0

給rc.local運行權限

chmod +x /etc/rc.local

可以先自己運行下看腳本是否有問題(記得把日誌文件刪除)

sudo /etc/./rc.local

最後啓動系統服務

sudo systemctl enable rc-local

enable是開機自啓動的意思,disable是關閉開機自啓動的意思
查看服務開機自啓動有沒有設置成功

systemctl is-enabled rc-local.service

如果返回static是說明服務不能設置開機自啓動

開啓服務

systemctl start rc-local.service

查看服務運行狀態

systemctl status rc-local.service

然後重啓電腦或者服務器,使用 cat 查看是否輸出 “/usr/local/rc.log” ,如果有的話就是添加成功了,如果失敗的話再看看是不是漏了步驟

cat /usr/local/rc.log
服務啓動成功

二、直接把frpc設置成fprcservice,可以開機自啓動

步驟跟方案一的差不多,先創建 /etc/systemd/system/frpc.service 文件,輸入:

[Unit]
Description=frpc
After=multi-user.target
 
[Service]
TimeoutStartSec=30
ExecStart=/root/frp_0.22.0_linux_amd64/frpc -c /root/frp_0.22.0_linux_amd64/frpc.ini
ExecStop=/bin/kill $MAINPID
 
[Install]
WantedBy=multi-user.target

ExecStart記得更改爲你要運行的shell命令
Description是服務名
After=multi-user.target意思是在系統正常運行後再啓動本服務(這個設置挺重要的,可以避免一些莫名其妙的錯誤)
其他步驟基本和方案一類似,這裏就不細講了

關於systemctl的其他命令

#修改服務之後systemctl的重加載
systemctl daemon-reload
#查看啓動失敗的服務列表
systemctl --failed
#查看開機自啓動的服務列表
systemctl list-unit-files|grep enabled
#重啓一個服務
sudo systemctl restart frpc.service
#重載一個服務
sudo systemctl reload nginx.service

配置文件的說明

[Unit]

Description : 服務的簡單描述

Documentation : 服務文檔

Before、After:定義啓動順序。Before=xxx.service,代表本服務在xxx.service啓動之前啓動。After=xxx.service,代表本服務在xxx.service之後啓動。

Requires:這個單元啓動了,它需要的單元也會被啓動;它需要的單元被停止了,這個單元也停止了。

Wants:推薦使用。這個單元啓動了,它需要的單元也會被啓動;它需要的單元被停止了,對本單元沒有影響。

[Service]

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

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

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

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

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

Type=idle: systemd會等待所有任務(Jobs)處理完成後,纔開始執行idle類型的單元。除此之外,其他行爲和Type=simple 類似。

PIDFile:pid文件路徑

ExecStart:指定啓動單元的命令或者腳本,ExecStartPre和ExecStartPost節指定在ExecStart之前或者之後用戶自定義執行的腳本。Type=oneshot允許指定多個希望順序執行的用戶自定義命令。

ExecReload:指定單元停止時執行的命令或者腳本。

ExecStop:指定單元停止時執行的命令或者腳本。

PrivateTmp:True表示給服務分配獨立的臨時空間

Restart:這個選項如果被允許,服務重啓的時候進程會退出,會通過systemctl命令執行清除並重啓的操作。

RemainAfterExit:如果設置這個選擇爲真,服務會被認爲是在激活狀態,即使所以的進程已經退出,默認的值爲假,這個選項只有在Type=oneshot時需要被配置。

[Install]

Alias:爲單元提供一個空間分離的附加名字。

RequiredBy:單元被允許運行需要的一系列依賴單元,RequiredBy列表從Require獲得依賴信息。

WantBy:單元被允許運行需要的弱依賴性單元,Wantby從Want列表獲得依賴信息。

Also:指出和單元一起安裝或者被協助的單元。

DefaultInstance:實例單元的限制,這個選項指定如果單元被允許運行默認的實例。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章