Đặt HIỂN THỊ trong tệp dịch vụ systemd


9

Tôi đang cố gắng học các dịch vụ systemd bằng cách cố gắng bắt đầu xclock như một dịch vụ; tập tin dịch vụ bên dưới

[Unit]
Description=clock

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

[Install]
WantedBy=graphical.target

Có ý kiến ​​gì sai ở đây không? Tôi đang gặp lỗi thông báo "không thể kết nối để hiển thị."

Câu trả lời:


18

Một ứng dụng cần hai thứ để mở một cửa sổ trên màn hình X. Nó cần biết vị trí của màn hình X; điều đó được truyền tải bởi DISPLAYbiến môi trường. Nó cũng cần xác thực với máy chủ X. Điều này được truyền tải thông qua một cookie, là một giá trị bí mật được tạo bởi máy chủ X khi nó khởi động và được lưu trữ trong một tệp mà chỉ người dùng khởi động máy chủ X mới có thể truy cập. Tệp cookie mặc định là ~/.Xauthority.

Nếu máy chủ X của bạn đang sử dụng vị trí tệp cookie mặc định, thì việc thêm Environment=XAUTHORITY=/home/dogs/.Xauthoritysẽ hoạt động (giả sử /home/dogslà thư mục chính của người dùng đã đăng nhập dưới X). Nếu bạn cần tìm vị trí, hãy xem Tôi có thể khởi chạy chương trình đồ họa trên máy tính để bàn của người dùng khác với quyền root không? Mở một cửa sổ trên màn hình X từ xa (tại sao không thể mở màn hình hiển thị X)?

Ngoài ra, chạy chương trình với tư cách là người dùng đang chạy máy chủ X sẽ hoạt động, miễn là tệp cookie nằm ở vị trí mặc định (nếu không, bạn sẽ phải định vị tệp cookie, như trong trường hợp gốc). Thêm Userchỉ thị (ví dụ User=dogs).

Tất nhiên, dịch vụ sẽ không chạy nếu không có màn hình X theo số đó do người dùng bạn chỉ định sở hữu.

Thật kỳ lạ khi bắt đầu một chương trình GUI từ Systemd. Nó không được thiết kế cho việc này. Các chương trình GUI sống trong một phiên X, được bắt đầu bởi người dùng. Systemd là dành cho các quy trình hệ thống. Bạn nên thử nghiệm với daemon thay thế.


1
Đó không phải là vấn đề sử dụng systemctl --user. Ngoài ra các DISPLAYbiến không phải là một vấn đề sau đó. Có một cái nhìn ở đây .
Suuuehgi

-2

Bạn có thể thêm vào .xinitrc:

xhost si:localuser:$USER

Nó làm việc cho tôi!


1
đây là cho các tệp dịch vụ systemd, không phải .xinitrc
tiếng lóng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.