Saya membaca bahwa ada dua folder untuk file unit (tidak dalam mode pengguna).
/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator
Bertentangan dengan pemahaman ini adalah jawaban untuk pertanyaan ini:Bagaimana menulis skrip startup untuk Systemd. Dapatkah seseorang mengisi informasi yang hilang sehingga saya mengerti apa yang sedang terjadi? (PERBARUI:Jawabannya telah diperbarui, dan pemahaman saya tidak lagi bertentangan dengannya. )
Juga, tampaknya skrip diatur dalam subfolder di dalam /etc/systemd/system/
map:
getty.target.wants
multi-user.target.wants
Di lokasi lain saya membaca bahwa ada lokasi lain. Sepertinya ini untuk layanan khusus pengguna.
/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.
Pembaruan 2015-08-31:
Demi orang lain, berikut ini tautan ke pertanyaan terkait yang baru-baru ini saya tanyakan:Di mana saya meletakkan skrip yang dieksekusi oleh unit systemd?
Jawaban yang Diterima:
Tempat terbaik untuk meletakkan sistem file unit: /etc/systemd/system
Pastikan untuk menambahkan target di bawah bagian [Instal], baca “Bagaimana cara mengetahuinya?” untuk rincian. PERBARUI :/usr/local/lib/systemd/system
adalah opsi lain, baca “Area Abu-abu” untuk detailnya.”
Tempat terbaik untuk menempatkan pengguna file unit: /etc/systemd/user
atau $HOME/.config/systemd/user
tetapi itu tergantung pada izin dan situasinya.
Yang benar adalah bahwa unit systemd (atau sebagai kalimat intro menyebutnya, "konfigurasi unit") dapat pergi ke mana saja —asalkan Anda bersedia membuat symlink manual dan Anda mengetahui peringatannya. Itu membuat hidup lebih mudah untuk menempatkan unit di mana systemctl daemon-reload
dapat menemukannya karena beberapa alasan bagus:
- Menggunakan lokasi standar berarti generator systemd akan menemukannya dan membuatnya mudah diaktifkan saat boot dengan
systemctl enable
. Ini karena unit Anda akan secara otomatis ditambahkan ke pohon ketergantungan unit (cache unit). - Anda tidak perlu memikirkan izin, karena hanya pengguna yang memiliki hak istimewa yang dapat menulis ke area yang ditentukan.
Bagaimana ia tahu?
Dan bagaimana tepatnya systemctl enable
tahu di mana membuat symlink? Anda melakukan hard code di dalam
unit itu sendiri di bawah [install]
bagian. Biasanya ada garis seperti
[Install]
WantedBy = multi-user.target
yang sesuai dengan tempat yang telah ditentukan pada sistem file.
Dengan cara ini, systemctl
tahu bahwa unit ini bergantung pada sekelompok file unit yang disebut multi-user.target
(“target” adalah istilah yang digunakan untuk menunjuk grup ketergantungan unit. Anda dapat membuat daftar semua grup dengan systemctl list-units --type target
). Grup file unit yang akan dimuat dengan target dimasukkan ke dalam targetname.target.wants
direktori. Ini hanyalah direktori yang penuh dengan symlink (atau yang asli). Jika [Install]
. Anda bagian mengatakan itu WantedBy
multi-user.target
, tetapi jika symlink ke sana tidak ada di multi-user.target.wants
direktori, maka itu tidak akan dimuat. Ketika generator unit systemd menambahkan file unit Anda ke cache pohon ketergantungan saat boot (Anda dapat memicu generator secara manual dengan systemctl daemon-reload
), secara otomatis mengetahui di mana harus meletakkan symlink—dalam hal ini di direktori /etc/systemd/system/multi-user.target.wants/
jika Anda mengaktifkannya.
Poin Penting dalam Manual:
Unit tambahan mungkin dimuat ke systemd (“linked”) dari
direktori bukan pada jalur pemuatan unit. Lihat perintah tautan untuk
systemctl(1).
Di bawah systemctl, cari Perintah File Unit
Jalur Pemuatan File Unit
Silakan baca dan pahami kalimat pertama dalam kutipan berikut dari man systemd.unit
(karena ini menyiratkan bahwa semua jalur yang saya sebutkan di sini mungkin tidak berlaku untuk Anda jika systemd Anda dikompilasi dengan jalur yang berbeda):
File unit dimuat dari satu set jalur yang ditentukan selama kompilasi, dijelaskan dalam dua tabel di bawah ini. File unit yang ditemukan di direktori yang terdaftar sebelumnya menimpa file dengan nama yang sama di direktori yang lebih rendah dalam daftar.
Ketika variabel
$SYSTEMD_UNIT_PATH
diatur, isi variabel ini menimpa jalur beban unit. Jika$SYSTEMD_UNIT_PATH
diakhiri dengan komponen kosong (“:”), jalur pemuatan unit yang biasa akan ditambahkan ke konten variabel.
Tabel 1 dan Tabel 2 dari man systemd.unit
bagus.
Muat jalur saat berjalan dalam mode sistem (--system
).
/etc/systemd/system
Konfigurasi lokal/run/systemd/system
Unit waktu proses/usr/lib/systemd/system
Unit paket yang diinstal (atau/lib/systemd/system
dalam beberapa kasus, bacaman systemd.unit
)
Muat jalur saat berjalan dalam mode pengguna (--user
)
Ada perbedaan antara per pengguna unit dan semua/global unit pengguna.
Bergantung pada pengguna
-
$XDG_CONFIG_HOME/systemd/user
Konfigurasi pengguna (hanya digunakan saat$XDG_CONFIG_HOME
sudah diatur) -
$HOME/.config/systemd/user
Konfigurasi pengguna (hanya digunakan saat$XDG_CONFIG_HOME
tidak disetel) -
$XDG_RUNTIME_DIR/systemd/user
Unit waktu proses (hanya digunakan saat$XDG_RUNTIME_DIR
sudah diatur) -
$XDG_DATA_HOME/systemd/user
Unit paket yang telah diinstal di direktori home (hanya digunakan ketika$XDG_DATA_HOME
sudah diatur) -
$HOME/.local/share/systemd/user
Unit paket yang telah diinstal di direktori home (hanya digunakan ketika$XDG_DATA_HOME
tidak disetel)
--global
(semua pengguna)
Unit yang berlaku untuk semua pengguna—artinya dimiliki oleh setiap pengguna juga. Jadi setiap pengguna dapat menghentikan layanan ini meskipun administrator mengaktifkannya saat boot.
/etc/systemd/user
Konfigurasi lokal untuk semua pengguna (systemctl --global enable userunit.service
)/usr/lib/systemd/user
Unit paket yang telah diinstal di seluruh sistem untuk semua pengguna (atau/lib/systemd/system
dalam beberapa kasus, baca man systemd.unit)/run/systemd/user
Unit waktu proses
Area Abu-abu
Di satu sisi, File Hierarchy Standard menetapkan bahwa /etc
adalah untuk konfigurasi lokal yang tidak menjalankan binari. Di sisi lain
itu menetapkan bahwa /usr/local/
"untuk digunakan oleh administrator sistem saat menginstal perangkat lunak secara lokal". Anda juga dapat berargumen (jika bukan hanya untuk tujuan organisasi) bahwa semua file unit sistem harus berada di bawah /usr/local/lib/systemd/system
, tetapi ini ditujukan untuk file unit yang merupakan bagian dari "perangkat lunak" bukan dari manajer paket.
Unit pengguna systemd terkait yang mencakup seluruh sistem dapat berada di bawah /usr/local/lib/systemd/user
.
Satuan Sementara
Tempat lain yang terlupakan sama sekali tidak ada di mana pun! Mungkin program yang kurang dikenal adalah systemd-run
. Anda dapat menggunakannya untuk menjalankan unit sementara dengan cepat. lihat man systemd-run
.
Misalnya, untuk menjadwalkan reboot besok pagi jam 4 pagi (Anda mungkin perlu --force
untuk memastikan reboot terjadi):
systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot
Ini akan menghasilkan file unit sementara restart.service
dan pengatur waktu yang sesuai (karena --on-calendar
, ditunjukkan oleh transient=yes
.
/run/systemd/transient/restart.service
# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine
[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"
Perhatikan bahwa ada juga opsi kekuatan ganda yang lebih berbahaya --force --force
, yang memberi tahu kernel untuk segera berhenti (dan, jika Anda tidak tahu apa yang Anda lakukan, tidak aman, karena hampir sama dengan memotong daya).