Electron整合Java服務端打deb包
環境和原始檔
- 系統:
本次使用系統環境為 deepin-desktop-community-20.3-amd64
-
原始檔結構樹:
demo資料夾為electron:build後輸出的資料夾(Linux環境下)
其中scripts、server、res資料夾為後新增到demo目錄中demo ├── chrome_100_percent.pak ├── chrome_200_percent.pak ├── chrome_crashpad_handler ├── chrome-sandbox ├── demo --electron打包成的Linux可執行檔案 ├── icudtl.dat ├── libEGL.so ├── libffmpeg.so ├── libGLESv2.so ├── libvk_swiftshader.so ├── libvulkan.so.1 ├── LICENSE.electron.txt ├── LICENSES.chromium.html ├── locales ├── resources ├── resources.pak ├── scripts --配置指令碼和服務 │ └── demo.service --Linux服務(後續有詳解) ├── server --Java服務 │ ├── demo.jar --Java服務jar包 │ └── jre --jre執行環境 ├── snapshot_blob.bin ├── swiftshader ├── res --資原始檔夾 │ └── Favs.ico --圖示ico檔案 ├── v8_context_snapshot.bin └── vk_swiftshader_icd.json
Service服務配置
-
demo.service完整內容
[Unit] Description=demo-server [Service] Type=simple ExecStart=/usr/local/demo/server/jre/bin/java -jar /usr/local/demo/server/demo.jar [Install] WantedBy=multi-user.target
-
Service 區塊配置
- [Unit] 區塊通常是配置檔案的第一個區塊,用來定義 Unit 的元資料,以及配置與其他 Unit 的關係。它的主要欄位如下。
欄位 說明 Description 簡短描述 Documentation 文件地址 Requires 當前 Unit 依賴的其他 Unit,如果它們沒有執行,當前 Unit 會啟動失敗 Wants 與當前 Unit 配合的其他 Unit,如果它們沒有執行,當前 Unit 不會啟動失敗 BindsTo 與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止執行 Before 如果該欄位指定的 Unit 也要啟動,那麼必須在當前 Unit 之後啟動 After 如果該欄位指定的 Unit 也要啟動,那麼必須在當前 Unit 之前啟動 Conflicts 這裡指定的 Unit 不能與當前 Unit 同時執行 Condition... 當前 Unit 執行必須滿足的條件,否則不會執行 Assert... 當前 Unit 執行必須滿足的條件,否則會報啟動失敗 - [Install] 通常是配置檔案的最後一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要欄位如下。
欄位 說明 WantedBy 它的值是一個或多個 Target,當前 Unit 啟用時(enable)符號連結會放入/etc/systemd/system目錄下面以 Target 名 + .wants字尾構成的子目錄中 RequiredBy 它的值是一個或多個 Target,當前 Unit 啟用時,符號連結會放入/etc/systemd/system目錄下面以 Target 名 + .required字尾構成的子目錄中 Alias 當前 Unit 可用於啟動的別名 Also 當前 Unit 啟用(enable)時,會被同時啟用的其他 Unit - [Service] 區塊用來 Service 的配置,只有 Service 型別的 Unit 才有這個區塊。它的主要欄位如下。
欄位 說明 Type 定義啟動時的程序行為。它有以下幾種值。 Type=simple 預設值,執行ExecStart指定的命令,啟動主程序 Type=forking 以 fork 方式從父程序建立子程序,建立後父程序會立即退出 Type=oneshot 一次性程序,Systemd 會等當前服務退出,再繼續往下執行 Type=dbus 當前服務通過D-Bus啟動 Type=notify 當前服務啟動完畢,會通知Systemd,再繼續往下執行 Type=idle 若有其他任務執行完畢,當前服務才會執行 ExecStart 啟動當前服務的命令 ExecStartPre 啟動當前服務之前執行的命令 ExecStartPost 啟動當前服務之後執行的命令 ExecReload 重啟當前服務時執行的命令 ExecStop 停止當前服務時執行的命令 ExecStopPost 停止當其服務之後執行的命令 RestartSec 自動重啟當前服務間隔的秒數 Restart 定義何種情況 Systemd 會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog TimeoutSec 定義 Systemd 停止當前服務之前等待的秒數 Environment 指定環境變數
Debian打包結構和配置
-
deb包結構
它具有DEBIAN和軟體具體安裝目錄(如etc, usr, opt, tmp等)
-
打包完整目錄樹
pkg ├── DEBIAN │ ├── control │ ├── postinst │ ├── postrm │ ├── preinst │ └── prerm └── usr ├── local │ └── demo --此demo資料夾為上邊原始檔demo └── share └── applications └── demo.desktop
-
Control完整內容:
Package: demo Section: Internet Priority: extra Version: 1.0.0 Maintainer: liuCh Architecture: amd64 Depends: libappindicator3-1 Recommends: libwebkit2gtk-4.0.37,libwebkitgtk-3.0-0 Description: This is demo
-
Control:
這個檔案主要描述軟體包的名稱(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和聯絡方式)以及描述(Description)等,是deb包必須具備的描述性檔案,以便於軟體的安裝管理和索引。
欄位 說明 例子/備註 Package 程式名稱 中間不能有空格 Version 軟體版本 Description 程式說明 Section 軟體類別 utils, net, mail, text, x11 Priority 軟體對於系統的重要程度 required, standard, optional, extra等; Essential 是否是系統最基本的軟體包 yes/no,若為yes,則不允許解除安裝(除非強制性解除安裝) Architecture 軟體所支援的平臺架構 i386, amd64, m68k, sparc, alpha, powerpc等 Source 軟體包的原始碼名稱 Depends 軟體所依賴的其他軟體包和庫檔案 若依賴多個軟體包和庫檔案,採用逗號隔開 Pre-Depends 軟體安裝前必須安裝、 配置依賴性的軟體包和庫檔案 常用於必須的預執行指令碼需求 Recommends 推薦安裝的其他軟體包和庫檔案 Suggests 建議安裝的其他軟體包和庫檔案 -
preinst完整內容: (校驗是否已存在demo資料夾和是不是root使用者安裝)
#!/bin/bash if [ -d "/usr/local/demo" ]; then echo "error: please uninstall demo package first." exit 1; fi if [ $(whoami) != 'root' ]; then if [ "$1" == "" ]; then echo 'demo client needs root to complete installation' else echo "$1" fi exit 1 fi
-
preinst:
在Deb包檔案解包之前(即軟體安裝前),將會執行該指令碼。可以停止作用於待升級軟體包的服務,直到軟體包安裝或升級完成。 -
postinst完整內容:(建立日誌資料夾和註冊demo.service服務設定開機自啟並啟動)
#!/bin/bash #kill all runing demo killall demo > /dev/null 2>&1 #clear log files if [ -d '/var/log/demo' ]; then rm -rf /var/log/demo fi mkdir /var/log/demo chmod 777 /var/log/demo #echo "create init" cp /usr/local/demo/scripts/demo.service /etc/systemd/system/demo.service || echoAndExit 'can not copy init file demo.service' #設定開機自啟 systemctl enable demo.service #啟動服務 systemctl start demo.service #建立桌面快捷圖示 cp /usr/share/applications/demo.desktop /home/$(who | awk '{print $1}')/Desktop/
-
postinst:
負責完成安裝包時的配置工作。如新安裝或升級的軟體重啟服務。軟體安裝完後,執行該Shell指令碼,一般用來配置軟體執行環境,必須以“#!/bin/sh”為首行。 -
prerm完整內容:(刪除服務)
#!/bin/bash systemctl stop demo.service systemctl disable demo.service rm /etc/systemd/system/demo.service > /dev/null 2>&1
-
prerm:
該指令碼負責停止與軟體包相關聯的daemon服務。它在刪除軟體包關聯檔案之前執行。 -
postrm完整內容:(刪除建立的日誌資料夾)
#!/bin/bash if [ "$1" == "purge" ]; then if [ -d "/var/log/demo" ]; then rm -rf /var/log/demo fi fi
-
postrm:
負責修改軟體包連結或檔案關聯,或刪除由它建立的檔案。軟體解除安裝後,執行該Shell指令碼,一般作為清理收尾工作,必須以“#!/bin/sh”為首行 -
demo.desktop完整內容
[Desktop Entry] #StartupWMClass=demo Categories=Network;RemoteControl; Comment=This is demo Comment[zh_CN]=這是一個演示 Exec=/usr/local/demo/demo GenericName=demo GenericName[zh_CN]=演示程式 Icon=/usr/local/demo/res/Favs.ico Name=demo Name[zh_CN]=演示 StartupNotify=false Terminal=false Type=Application X-Deepin-Vendor=user-custom
-
desktop
Desktop Entry檔案是Linux桌面系統中用於描述程式啟動配置資訊的檔案,它以.desktop為字尾名,相當於Windows系統下的桌面快捷方式。通常一個二進位制可執行程式是一個沒有後綴沒有圖示的檔案,不可以隨意移動。
因此很多Linux發行版都提供了啟動器,便於集中管理應用程式。啟動器本質是一個位於/usr/share/applications/路徑下的目錄。啟動器目錄中存放著很多.desktop檔案,每個.desktop檔案都是一個應用程式的入口,並且.desktop檔案可以顯示圖示,對使用者更加友好。- desktop 檔案結構
欄位 是否必選 說明 Version 否 該數值指定了當前 Desktop Entry 檔案所遵循的 Desktop Entry 檔案標準版本 Name 是 應用程式名稱 GenericName 否 應用程式的通用名稱 Comment 否 描述 Type 是 "Type"定義了Desktop Entry檔案的型別。常見的"Type"數值是"Application"和"Link"。"Type = Application"表示當前Desktop Entry檔案指向了一個應用程式;而"Type = Link"表示當前Desktop Entry檔案指向了一個URL (Uniform Resource Locator)。 Exec 否 "Exec"只有Type=Application才有效,"Exec"的數值定義了啟動指定應用程式所要執行的命令,在此命令是可以帶引數的 URL 否 "URL"只有Type=Link才有效。"URL"的數值定義了該Desktop Entry檔案指向的URL Icon 否 "Icon"的數值是以絕對路徑的格式給出,圖示的絕對路徑。 StartupNotify 否 布林值,只有Type=Application才有效,如果為true,則已知應用程式在使用DESKTOP_STARTUP_ID環境變數集啟動時將傳送“remove”訊息。 Terminal 否 布林值,只有Type=Application才有效,相關應用程式(即關鍵字"Exec"的數值)是否需要在終端視窗中執行. Categories 否 只有Type=Application才有效,程式在選單中顯示的類別,network:網路應用;Chat:社交溝通;Audio:音樂欣賞;Video:視訊播放;Graphics:圖形影象;Office:辦公學習;Translation:閱讀翻譯;Development:程式設計開發;Utility:系統管理; -
補充:
- 檔案比較運算子
命令 說明 例子/備註 -e filename 如果 filename存在,則為真 [ -e /var/log/syslog ] -d filename 如果 filename為目錄,則為真 [ -d /tmp/mydir ] -f filename 如果 filename為常規檔案,則為真 [ -f /usr/bin/grep ] -L filename 如果 filename為符號連結,則為真 [ -L /usr/bin/grep ] -r filename 如果 filename可讀,則為真 [ -r /var/log/syslog ] -w filename 如果 filename可寫,則為真 [ -w /var/mytmp.txt ] -x filename 如果 filename可執行,則為真 [ -x /usr/bin/grep ] filename1-nt filename2 如果 filename1比 filename2新,則為真 [ /tmp/install/etc/services -nt /etc/services ] filename1-ot filename2 如果 filename1比 filename2舊,則為真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
- 字串比較運算子 (請注意引號的使用,這是防止空格擾亂程式碼的好方法)
命令 說明 例子/備註 -z string 如果 string長度為零,則為真 [ -z "$myvar" ] -n string 如果 string長度非零,則為真 [ -n "$myvar" ] string1= string2 如果 string1與 string2相同,則為真 [ "$myvar" = "one two three" ] string1!= string2 如果 string1與 string2不同,則為真 [ "$myvar" != "one two three" ]
- 算術比較運算子
命令 說明 例子/備註 num1-eq num2 等於 [ 3 -eq $mynum ] num1-ne num2 不等於 [ 3 -ne $mynum ] num1-lt num2 小於 [ 3 -lt $mynum ] num1-le num2 小於或等於 [ 3 -le $mynum ] num1-gt num2 大於 [ 3 -gt $mynum ] num1-ge num2 大於或等於 [ 3 -ge $mynum ]
dpkg命令
-
打包
dpkg -b . demo.deb
第一個引數為需要打包的目錄路徑("."為當前目錄),第二個引數為deb包名
-
安裝
dpkg -i demo.deb
-
強制安裝
dpkg --force-depends -i demo.deb
強制安裝可能會有依賴問題,慎用。
-
解除安裝
dpkg -r demo
刪除包,但保留配置檔案
dpkg -P|--purge my-deb
刪除包和配置檔案
-
解包
dpkg --unpack demo.deb
-
檢視deb包是否安裝/deb包的資訊
dpkg -s demo
-
檢視deb包檔案內容
dpkg -c demo.deb
-
解壓deb中所要安裝的檔案
dpkg -x demo.deb demo
第一個引數為所要解壓的deb包,第二個引數為將deb包解壓到指定的目錄
-
解壓deb包中DEBIAN目錄下的檔案(至少包含control檔案)
dpkg -e demo.deb demo/DEBIAN
-
列出與該包關聯的檔案
dpkg -L demo
-
配置軟體包
dpkg --configure demo