快轉到主要內容

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強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。