1. 簡要介紹:
用戶想要在S99_userapp調用之前就啟動應用程序,可以通過systemd方案實現。
1.1 Systemd
Systemd 是一個系統和服務管理器,也是 Linux 操作系統中最常用的初始化系統之一。最早是為了代替傳統的初始化系統(init)而開發的,相較于傳統 init,systemd 具有支持并行啟動,【可同時啟動多個服務】,提高系統啟動速度的優勢,可以更好地管理系統和服務進程。目前,許多主流 Linux 發行版都采用了 systemd 作為其默認的初始化系統,包括 Ubuntu、Debian、Fedora、CentOS、Arch Linux 等。
1.2 服務單元文件
Systemd通過【服務單元文件】進行開機啟動管理。【服務單元文件】指的是在 /etc/systemd/system 目錄中以“.service”后綴的結尾的文件。
2. 操作指導:
2.1 配置開機啟動服務
建立adb連接(不清楚如何操作,可參考《入門指南/開發板調試方式介紹》中的1.ADB調試)
執行命令,切換到板卡環境:
adb shell
首先我們在 /etc/systemd/system/ 創建一個自己的【服務單元文件(Systemd Service)】:myservice.service。
cd /etc/systemd/system/ vim myservice.service
注意:Systemd Service 既可位于 /etc/systemd/system(供系統管理員和用戶使用),也可以位于/usr/lib/systemd/system(供發行版打包者使用),我們一般使用前者即可。
【服務單元文件】腳本文件以 .service 結尾,由 Unit、Service 和 Install 三個區塊組成,以下為 service 文件腳本樣例:
注意:ExecStart為指定啟動單元的命令或者腳本,是配置文件里面最重要的字段,下面來演示如何創建并編輯腳本。
2.2 創建并編輯腳本
創建一個可執行的腳本用于啟動Service進程,用戶可根據需求向腳本寫入需要執行的可執行文件,此處的腳本僅服務于演示需要。
執行命令,先定位到/userdata目錄:
cd /userdata
然后通過vim命令,可以創建start.sh腳本進行編輯:
touchstart.sh chmod755start.sh vimstart.sh
注意:這里簡單地通過編譯hellonano.c生成了hellonano可執行文件,僅為在此進行說明演示。用戶需根據自己需求向腳本寫入需要執行的可執行文件。
2.3 驗證開機啟動:
在創建或修改任何【服務單元文件】后,我們必須讓 systemd 知道有新的【服務單元文件被創建】或者【服務單元文件被修改】,可通過下方命令讓systemd執行查找與同步:
systemctl daemon-reload
此時,我們新的【服務單元文件】應該已經被識別,我們可通過下方命令啟動它:
systemctl start myservice.service
最后,告訴 systemd 使能新的【服務單元文件】,以便每次開機啟動時它都會啟動:
systemctl enable myservice.service
注意:您不會從此命令中獲得反饋,因為它所做的只是向 systemd 發送一條消息,告訴它啟動您的服務。您鍵入的命令不會停留以查看接下來會發生什么。
我們可以用以下命令來檢查我們的服務,確保它看起來沒問題
systemctl status myservice.service
Loaded行:配置文件的位置,是否設為開機啟動
Active行:表示正在運行
Main PID行:主進程ID
CGroup塊:應用的所有子進程
日志塊:應用的日志
下面我們進行軟件重啟,在adb shell環境下輸入重啟命令
reboot
進入板卡環境
adb shell
最終程序運行后,可在ps -x進程列表中看到進程在啟動運行
ps -x
注意:要在該程序源代碼中加入死循環,否則無法看到該程序正在運行
3. 詳細說明:
3.1 [Unit] 啟動順序與依賴關系
定義控制單元 [Unit]
所有引導過程中 Systemd 要控制的東西都是一個單元。基本的用法如下:
Description:代表整個單元的描述,可根據需要簡單填寫。
Environment:環境變量或參數(系統環境變量此時無法使用)
After:描述服務類別,表示本服務需要在某服個務(*.service)或多個服務啟動后再啟動,也可以表示需要在某個服務組(*.target)啟動后再啟動。
Before:表示本服務需要在某些服務啟動之前啟動,通常不建議使用此配置,因為后面的服務有可能會被本服務阻塞。
Defaultdependencies=no 可以禁止默認依賴的注入,是為了【減少錯誤】 和 【減少單元配置文件的體量】。
Wants:本單元啟動了,它“想要”的單元也會被啟動。但是這個單元若啟動不成功,對本單元沒有影響。
Requires: 這個設定并不能控制啟動順序,它表示"強依賴"關系,即如果該服務啟動失敗或異常退出,則本單元也無法啟動,所以不建議使用這個字段。
OnFailure:若本單元啟動失敗了,那么啟動這個單元作為折衷。
3.2 [Service] 啟動行為
定義服務本體 [service]
在定義完了 Systemd 用來識別服務的單元后,我們來定義服務本體。基本的用法如下:
Type:服務的類型,各種類型的區別如下所示
simple:默認,這是最簡單的服務類型。ExecStart字段啟動的進程為主進程
forking:ExecStart 字段將以 fork() 方式啟動,此時父進程將會退出,子進程將成為主進程(例如用 shell 腳本啟動服務進程)。
oneshot:適用于那些被一次性執行的任務或者命令,它運行完成后便了無痕跡。類似于simple,但只執行一次,Systemd 會等它執行完,才啟動其他服務。
dbus:這個程序啟動時需要獲取一塊 DBus 空間,所以需要和 BusName= 一起用。只有它成功獲得了 DBus 空間,依賴它的程序才會被啟動。
ExecStart:在輸入的命令是start時候執行的命令,這里的命令啟動的程序必須使用絕對路徑,比如你必須用/sbin/arp而不能簡單的以環境變量直接使用arp。
ExecStop:在輸入的命令是stop時候執行的命令,要求同上。
ExecReload:這個不是必需,如果不寫則你的service就不支持restart命令。ExecStart和ExecStop是必須要有的。
3.3 [Install] 安裝服務
安裝服務 [install]
服務編寫完之后還需要被systemd裝載,定義安裝單元各個字段如下:
WantedBy:設置服務被誰裝載,一般設置為multi-user.target
執行以下命令可查看multi-user.target所包含的所有服務
systemctl list-dependencies multi-user.target
3.4關于TARGET
Target 的含義是【服務組】,如 WantedBy=multi-user.target 指的是該服務所屬于 multi-user.target。當執行以下命令時,xxx.service 的符號鏈接就會被創建在 /etc/systemd/system/multi-user.target 目錄下。
systemctl enable xxx.service
可以通過以下命令查看系統默認啟動的 target
systemctl get-default
一般為 multi-user 或者是 graphical。因此配置好相應的 WantedBy 字段,可以實現服務的開機啟動。
注意:常用的 Target 有兩個:一個是multi-user.target,表示多用戶命令行狀態;另一個是graphical.target,表示圖形用戶狀態,它依賴于multi-user.target。
審核編輯 黃宇
-
開發板
+關注
關注
25文章
5481瀏覽量
101917 -
rv1126
+關注
關注
0文章
106瀏覽量
3332
發布評論請先 登錄
基于RV1126開發板實現人臉檢測方案

基于RV1126開發板實現人臉檢測方案

基于RV1126開發板實現人臉檢測方案

基于RV1126開發板的音頻硬件電路設計

基于RV1126開發板網絡配置方法

評論