Mengatur DISPLAY dalam file layanan systemd

9

Saya mencoba mempelajari layanan systemd dengan mencoba memulai xclock sebagai layanan; file layanan di bawah ini

[Unit]
Description=clock

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock

[Install]
WantedBy=graphical.target

Ada ide apa yang salah di sini? Saya mendapatkan pesan kesalahan yang mengatakan "tidak dapat terhubung ke tampilan."

anjing
sumber

Jawaban:

18

Aplikasi membutuhkan dua hal untuk membuka jendela pada tampilan X. Perlu mengetahui lokasi tampilan X; yang disampaikan oleh DISPLAYvariabel lingkungan. Ini juga perlu diautentikasi dengan X server. Ini disampaikan melalui cookie, yang merupakan nilai rahasia yang dihasilkan oleh server X saat dijalankan dan disimpan dalam file yang hanya dapat diakses oleh pengguna yang memulai server X. File cookie default adalah ~/.Xauthority.

Jika server X Anda menggunakan lokasi file cookie default, maka menambahkan Environment=XAUTHORITY=/home/dogs/.Xauthorityakan berfungsi (dengan asumsi /home/dogsdirektori home dari pengguna yang login di bawah X). Jika Anda perlu menemukan lokasi, lihat Dapatkah saya meluncurkan program grafis di desktop pengguna lain sebagai root? dan Buka jendela pada tampilan X jarak jauh (mengapa "Tidak bisa membuka layar")?

Atau, menjalankan program sebagai pengguna yang menjalankan X server akan berfungsi, asalkan file cookie berada di lokasi default (jika tidak, Anda harus mencari file cookie, seperti dalam kasus root). Tambahkan Userarahan (misalnya User=dogs).

Tentu saja layanan tidak akan berjalan jika tidak ada tampilan X oleh nomor yang dimiliki oleh pengguna yang Anda tentukan.

Agak aneh memulai program GUI dari Systemd. Itu tidak dirancang untuk ini. Program GUI hidup dalam sesi X, dimulai oleh pengguna. Systemd adalah untuk proses sistem. Anda seharusnya bereksperimen dengan daemon.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Itu tidak masalah menggunakan systemctl --user. Juga DISPLAYvariabel bukan masalah kalau begitu. Silahkan lihat di sini .
Suuuehgi
-2

Anda dapat menambahkan .xinitrc:

xhost si:localuser:$USER

Ini bekerja untuk saya!

Monica
sumber
1
ini untuk file layanan systemd, bukan .xinitrc
slang