Saya sudah meneliti ini dan jawaban grawity sepertinya ketinggalan zaman. Anda sekarang dapat mengatur layanan pengguna dengan systemd yang dijalankan dengan sebagai bagian dari sesi pengguna. Mereka dapat mengatur DISPLAY dan XAUTHORITY (saat ini dalam Arch dan Debian Stretch).
Ini masuk akal dibandingkan rekomendasi sebelumnya untuk menggunakan file autostart desktop, karena Anda mendapatkan manajemen proses seperti halnya Anda menggunakan aplikasi tingkat sistem (restart, dll).
Dokumen terbaik saat ini adalah Arch wiki; Systemd / Pengguna
Versi TLDR;
- Buat file * .service yang diinginkan di
~/.config/systemd/user/
- Jalankan
systemctl --user enable [service]
(kecualikan sufiks .service)
- Secara opsional jalankan
systemctl --user start [service]
untuk memulai sekarang
- Gunakan
systemctl --user status [service]
untuk memeriksa bagaimana kinerjanya
Beberapa perintah lain yang bermanfaat.
systemctl --user list-unit-files
- lihat semua unit pengguna
- s
ystemctl --user daemon-reload
- jika Anda mengedit file layanan
- Nanti ...
Saya memutakhirkan dan mengonversikan sebagian besar daemon sesi saya ke file serviced systemd. Jadi saya bisa menambahkan beberapa catatan tambahan.
Tidak ada kait default untuk menjalankan layanan saat login, jadi Anda harus memicunya sendiri. Saya melakukannya dari file ~ / .xsession saya.
systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target
Baris pertama mengimpor beberapa variabel lingkungan ke dalam sesi pengguna systemd dan yang kedua memulai target. File xsession.target saya;
[Unit]
Description=Xsession running
BindsTo=graphical-session.target
Xbindkeys.service saya sebagai contoh.
[Unit]
Description=xbindkeys
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always
[Install]
WantedBy=xsession.target
Petunjuk yang biasa adalah "jangan".
redshift
bukan layanan seluruh sistem - itu akan memiliki contoh terpisah untuk setiap sesi , dan perlu tahu tentang bagaimana menghubungkan ke Xorg sesi tertentu itu.(Xorg juga bukan layanan sistem - hanya pengelola layar , dan juga meluncurkan Xorg terpisah untuk setiap sesi. //
graphical.target
akan memberi tahu Anda ketika pengelola layar siap, tetapi tidak mengatakan kapan DM memulai sebenarnya. pertama - atau semua - tampilan.)Memulai dengan boot saja
DISPLAY=:0
tidak cukup, karena tidak ada jaminan bahwa hanya ada satu tampilan pada waktu tertentu, juga tidak selalu:0
(misalnya, jika Xorg crash meninggalkan lockfile basi, yang berikutnya akan berjalan:1
seperti itu akan berpikir:0
masih sibuk); Anda juga perlu mengatur path keXAUTHORITY
file Anda karena X11 memerlukan otentikasi; dan pastikanredshift
akan dimulai kembali jika Anda pernah keluar & masuk lagi.Jadi bagaimana memulainya? Hampir selalu, lingkungan desktop memiliki beberapa metode untuk memulai layanan sesi sendiri . Lihat posting lama yang sudah menggambarkan dua yang biasa; yang
~/.xprofile
script dan~/.config/autostart/*.desktop
lokasi.Jika Anda menggunakan startx , Anda dapat menggunakannya
~/.xinitrc
untuk memulai hal-hal seperti itu. Manajer jendela mandiri seringkali memiliki skrip startup / init sendiri; misalnya~/.config/openbox/autostart
untuk Openbox.Apa yang umum untuk semua metode ini adalah bahwa program dimulai dari dalam sesi - menghindari semua masalah yang tercantum di atas.
sumber
Inilah yang baru saja saya buat sebagai solusi untuk yang belum tersedia
graphical-session.target
(Pada sistem Kubuntu 16.04 saya):Buat
~/.config/systemd/user/xsession.target
dengan konten berikut:Beri tahu systemd tentang unit baru ini:
xsession.target
via mekanisme desktop Ubuntu 16.04 yang saat ini tersedia.Buat
~/.config/autostart-scripts/xsession.target-login.sh
dengan konten berikut:Buat
~/.config/plasma-workspace/shutdown/xsession.target-logout.sh
dengan konten berikut:Jadikan skrip dapat dieksekusi:
Catatan: dua file ini ditempatkan di mana KDE akan mengambilnya untuk mulai otomatis dan mematikan. File mungkin ditempatkan di tempat lain untuk lingkungan desktop lain (misalnya Gnome) - tapi saya tidak tahu tentang lingkungan itu.
Catatan: Solusi ini kurang mendukung sesi multi desktop. Ini hanya menangani dengan
graphical-session.target
benar selama hanya satu sesi X11 aktif dijalankan pada mesin (tapi itu kasus bagi kebanyakan dari kita pengguna linux).graphical-session.target
dan menjalankannya dengan bersih saat sedang login di desktop Anda.Sebagai contoh, unit @ mkaito akan terlihat seperti ini:
(Jangan lupa lakukan
daemon-reload
setelah mengedit unit Anda!)Di masa mendatang (apakah itu Ubuntu 17.04?) Solusi saya menjadi usang karena sistem akan menangani dengan
graphical-session.target
benar. Pada hari itu cukup hapus script autostart dan shutdown dan jugaxsession.target
- unit pengguna khusus Anda mungkin tetap tidak tersentuh dan hanya berfungsi.sumber
Solusi ini tepat seperti yang ditanyakan oleh penulis pertanyaan:
Meskipun mungkin ada cara yang lebih baik untuk melakukannya, seperti yang sudah dijawab oleh pengguna lain, ini adalah pendekatan lain untuk masalah ini.
Ini mirip dengan systemd -networkd-wait-online.service systemd yang memblokir sampai kriteria tertentu dipenuhi. Layanan lain yang bergantung padanya akan diluncurkan segera setelah layanan ini mulai berhasil atau habis.
Per manual (bagian "File"), X server akan membuat soket UNIX
/tmp/.X11-unix/Xn
(di manan
adalah nomor tampilan).Dengan memantau keberadaan soket ini, kami dapat menentukan bahwa server untuk tampilan tertentu telah dimulai.
confirm_x_started.sh
:x_server_started.service
:Sekarang, aktifkan
x_server_started.service
untuk memulai pada saat yang sama dengan server X.Buat layanan lain (yang memerlukan X server untuk memulai) untuk bergantung
x_server_started.service
unit tergantung:
Jika X server mulai tanpa masalah, sistem
x_server_started.service
akan segera dimulai dan systemd akan melanjutkan untuk memulai semua unit yang bergantungx_server_started.service
.sumber