Autostart Linux programs on boot.
測試過的作業系統:Ubuntu LTS,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
或.bashrc
或rc.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
- 新增unit,取名為autostartscript
sudo vim /etc/systemd/systemd/autostartscript.service
- 填入以下內容,
ExecStart
後接執行指令稿的指令,只執行一次
[Unit]
Description=autostartscript
[Service]
Type=oneshot
ExecStart=/bin/bash /home/user/backup.sh
- 啟用服務
sudo systemctl daemon-reload
sudo systemctl enable --now autostartscript.service
- 之後可以用
systemctl status
指令看服務執行情況:
sudo systemctl status autostartscript.service
2.2. systemd user service (一般使用者)#
此處的服務在登入特定使用者(圖形界面或SSH都可以)後才會啟動。
使用者級別的systemd服務一律放在~/.config/systemd/user/
- 新增unit,取名為autostartscript
vim ~/.config/systemd/user/autostartscript.service
- 填入以下內容,
ExecStart
後接執行指令稿的指令,只執行一次
[Unit]
Description=autostartscript
[Service]
Type=oneshot
ExecStart=/bin/bash /home/user/backup.sh
- 啟用服務。注意這裡我沒有使用sudo。
systemctl --user daemon-reload
systemctl --user enable --now autostartscript.service
- 之後可以用
systemctl --user status
指令看服務執行情況:
systemctl --user status autostartscript.service