快轉到主要內容

Linux如何設定開機自動執行應用程式

分類   Linux系統 Linux使用技巧
標籤   Ubuntu Arch Linux
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

Autostart Linux programs on boot.

測試過的作業系統:Ubuntu 22.04,Arch Linux 6.4.3

何謂自動啟動程式
#

在Linux上可以設定開機自動執行某程式,例如/usr/bin/firefox,它就會像下圖一樣,在開機後自動開啟Firefox瀏覽器:

或者設定開機自動執行shell指令稿,例如家目錄放置一個/home/user/backup.sh,開機後自動執行裡面所寫的指令。

不論為何者,建議在填寫程式路徑的時候填「絕對路徑」。

自動啟動又可以分為「系統開機後執行」以及「一般使用者登入桌面環境後才執行」二種。如果是前者,您應該使用systemd的系統服務來設定,若是後者就用圖形界面Desktop Entry或systemd user service設定吧。

1. 用圖形界面設定自動啟動的程式
#

許多桌面環境內建的「自動啟動服務」工具,只適合啟動一般使用者身份的程式,不能有sudo。

通常桌面環境的自動啟動,都是讀取autostart目錄下的「Desktop Entry」。

1.1. 理解何為Desktop Entry
#

.desktop檔案是Freedesktop.org制定的XDG Desktop Entry標準,您在應用程式列表看到的程式圖示就是Desktop Entry所組成。

如果將Desktop Entry放在~/.config/autostart目錄,桌面環境就會在使用者登入圖形界面時啟動放在autostart目錄下的程式。大部分桌面環境(KDE、GNOME、XFCE、LXQT、Cinnamon)都遵守此標準。

還請注意Desktop Entry只能幫你啟動程式而已,無法管理行程。如果你希望啟動的是一個「系統服務」,可以隨時停止和重啟,那麼請改用Systemd指令。

一個最基本的Desktop Entry長這樣:

[Desktop Entry]

Type=Application

# 應用程式名稱
Name=My Script

# 註解
Comment=Execute script on login

# 應用程式工作的目錄
Path=/home/user/

# 要執行的指令或執行檔,可加引數
Exec=/bin/bash backup.sh

# 是否在終端機執行
Terminal=false

# 不顯示在應用程式列表
NoDisplay=true

如果您不知道怎麼寫,可以將系統應用程式的Dekstop Entry複製出來(通常位於/usr/share/applications~/.local/share/applications/),並參考 Arch Wiki來寫Dekstop Entry。

1.2. KDE
#

點選系統設定 → 啟動與關閉 →自動啟動,新增要啟動的程式或指令稿。

KDE新增的是位於~/.config/autostart的.desktop檔案,您可以點進去手動修改詳細指令,或者手動把.desktop檔案放到該目錄。

KDE亦可以新增「登出」時執行的指令稿。

1.3. GNOME
#

開啟終端機,安裝gnome-startup-applications套件,此套件Ubuntu已內建。gnome-tweaks的初始應用程式設定太陽春,不建議。

開啟「初始啟動程式」程式,加入要啟動的程式

GNOME自動啟動的程式位於~/.config/autostart,您可以手動編輯.desktop檔案的指令。

2. 用指令設定自動啟動的程式
#

過去要設定自動啟動服務,我們會調整.desktop.bashrcrc.local等檔案。

.desktop在登入圖形環境後啟動,大多數桌面都支援(見上一節KDE與GNOME的設定方式)。.bashrc則是專屬於Bash的,一登入bash shell就會啟動。至於rc.local過於老舊,不建議使用。

現在呢Systemd是最新的主流方法,優點是統一用systemctl指令管理系統服務,還可以配合systemd timer作定時操作,缺點是它的語法比過去的要繁瑣些。

假設我現在家目錄/home/user有一個叫做backup.sh的備份指令稿,我想在開機執行一次,那就將其做成系統服務。其中Systemd的服務又可以分為系統(system service)與使用者服務(user service)。如果執行的指令需要root,就把它做成系統服務吧。

2.1. systemd system service (系統)
#

不論使用者有無登入系統,新增到系統的服務一律會在電腦開機後啟動,執行身份是root。當然使用者沒登入系統,X視窗沒執行,就不該用來啟動圖形化的程式啦。

系統級別的systemd服務一律放在/etc/systemd/systemd/。由於執行身份是root,不需要寫sudo

  1. 新增unit,取名為autostartscript
sudo vim /etc/systemd/systemd/autostartscript.service
  1. 填入以下內容,ExecStart後接執行指令稿的指令,只執行一次
[Unit]
Description=autostartscript

[Service]
Type=oneshot
ExecStart=/bin/bash /home/user/backup.sh
  1. 啟用服務
sudo systemctl daemon-reload
sudo systemctl enable --now autostartscript.service
  1. 之後可以用systemctl status指令看服務執行情況:
sudo systemctl status autostartscript.service

2.2. systemd user service (一般使用者)
#

此處的服務在登入特定使用者(圖形界面或SSH都可以)後才會啟動。

使用者級別的systemd服務一律放在~/.config/systemd/user/

  1. 新增unit,取名為autostartscript
vim ~/.config/systemd/user/autostartscript.service
  1. 填入以下內容,ExecStart後接執行指令稿的指令,只執行一次
[Unit]
Description=autostartscript

[Service]
Type=oneshot
ExecStart=/bin/bash /home/user/backup.sh
  1. 啟用服務。注意這裡我沒有使用sudo。
systemctl --user daemon-reload
systemctl --user enable --now autostartscript.service
  1. 之後可以用systemctl --user status指令看服務執行情況:
systemctl --user status autostartscript.service

參考資料
#

相關文章

蝦密?Linux系統竟然有開關機音效
分類   Linux系統 Linux使用技巧
標籤   Ubuntu GNOME KDE Plasma
Arch Linux安裝多重Python版本,使其共存
分類   Linux系統 Linux使用技巧
標籤   Arch Linux Python
Linux系統安裝Anaconda教學,讓多版本Python共存
分類   Linux系統 Linux好用軟體
標籤   Anaconda Python Arch Linux Ubuntu

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。