Tại sao dịch vụ systemd được kích hoạt của tôi không khởi động?


20

Tôi có tệp đơn vị systemd sau /etc/systemd/system/emacs.service:

[Unit]
Description=Emacs: the extensible, self-documenting text editor
Documentatin=man:emacs(1) info:Emacs


[Service]
Type=forking
ExecStart=/usr/bin/emacs --daemon
ExecStop=/usr/bin/emacsclient --eval "(progn (setq kill-emacs-hook nil) (kill-emacs))"
Restart=always
Environment=DISPLAY=:%i
TimeoutStartSec=0

[Install]
WantedBy=default.target

Tôi muốn điều này bắt đầu khi khởi động, vì vậy tôi đã nhập systemctl enable emacs

Tuy nhiên, mỗi lần dịch vụ của tôi khởi động lại, systemctl status emacshiển thị:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Nhưng sau đó nhập systemctl start emacsvà kiểm tra trạng thái trả về:

● emacs.service - Emacs: the extensible, self-documenting text editor
   Loaded: loaded (/etc/systemd/system/emacs.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2016-11-11 23:03:59 UTC; 4s ago
  Process: 3151 ExecStart=/usr/bin/emacs --daemon (code=exited, status=0/SUCCESS)
 Main PID: 3154 (emacs)
    Tasks: 2
   Memory: 7.6M
      CPU: 53ms
   CGroup: /system.slice/emacs.service
           └─3154 /usr/bin/emacs --daemon

Làm thế nào tôi có thể có được quá trình này để bắt đầu khởi động thành công?

Câu trả lời:


9

Tôi không biết tại sao nhưng để làm việc này tôi:

đã xóa Environment=DISPLAY=:%i

thêm một User=biến

Đảm bảo rằng tệp chính xác đã được nhập vào /etc/systemd/system/emacs.service(trước đó nó là một liên kết cứng)

và chạy lại systemctl enable emacs

Điều này làm cho nó hoạt động.

EDIT Vấn đề thực sự ở đây là tôi đã mắc lỗi đánh máy ở dòng 3: Documentatin

Tôi tìm thấy điều này bằng cách kiểm tra journalctl. Tôi đề nghị bất cứ ai có vấn đề với tập lệnh systemd đều làm như vậy vì không có lỗi nào được gửi đến stderr.


Điều đó cũng làm việc trên một khởi động lại? Tôi đoán nếu chế độ daemon không yêu cầu kết nối X11, thì tôi không cần phải After=...đề cập đến.
Alexis Wilke

1
Có nó hoạt động sau khi khởi động lại. Đây không phải là một Emacs đồ họa nên không cần X11. Đó chỉ là một dòng tôi đã sao chép từ một ví dụ và không chú ý.
Bắt đầu

3

Ồ, điều này thật thú vị.

Chọn một đơn vị dịch vụ ngẫu nhiên và nhìn chằm chằm vào nó, nó phụ thuộc vào một mục tiêu cụ thể thay vì default.target. Cái sau mang tính biểu tượng ... một liên kết được cấu hình đến một mục tiêu cụ thể, về mặt ngữ nghĩa, nó không có ý nghĩa. (Xem systemctl set-default)

Điều đó có thể giải thích tại sao dịch vụ của bạn hiển thị như disabledsau khi bạn kích hoạt nó. Hãy thử thay thế default.targettrong tệp dịch vụ của bạn multi-user.target, ví dụ.

(Không báo cáo lỗi khi không bật có vẻ như là một khiếm khuyết trong systemd. Tôi gần như tự hỏi liệu bây giờ bạn có một thư mục không /etc/systemd/system/default.target.wants).


Lệnh Tạp chí cho bạn biết những gì đã phá vỡ (ví dụ tại sao việc bật không thành công.) Đối với liên kết, không bắt buộc nếu bạn tạo dịch vụ cá nhân của riêng mình. Sẽ không thành vấn đề nếu bạn tạo một gói mà bạn muốn người khác cài đặt / gỡ bỏ, v.v.
Alexis Wilke

@AlexisWilke Điều đó còn tồi tệ hơn nữa! Tại sao nó sẽ được viết để báo cáo một số lỗi cho stderr và những người khác cho tạp chí?
sourcejedi

Nó viết tất cả mọi thứ cho tạp chí. Từ những gì tôi đã thấy, bạn chỉ thấy một lỗi rất cơ bản, cụ thể theo hệ thống, nếu nó không thể khởi động trình nền.
Alexis Wilke

2
Người dùng không báo cáo ngay cả một lỗi cơ bản, họ tin rằng hoạt động đã thành công và do đó đã tiến hành khởi động lại. tại mệnh giá, có một khiếm khuyết trong systemd. Người dùng cũng có các chế độ thất bại, nhưng đối với tôi, nó không giống như việc xem thông báo lỗi hoàn toàn là một vấn đề rất có thể xảy ra trong câu hỏi này.
sourcejedi

1
@sourcejedi Tôi không biết làm thế nào bạn biết điều này nhưng vâng, bây giờ tôi có một danh sách tại /etc/systemd/system/default.target.wants Inside đó là các tệp dịch vụ của tôi. Và vâng, tôi không biết có bất kỳ lỗi nào.
Bắt đầu

1

Bạn có một biến môi trường HIỂN THỊ, điều đó có nghĩa là bạn muốn X11 được bắt đầu. Vì vậy, bạn cần phải có một cách để chặn dịch vụ của bạn cho đến khi đó.

Này được thực hiện sử dụng các After=...tùy chọn .

Tôi đã không làm điều đó một mình, vì vậy tôi không thể nói rằng nó sẽ làm việc, nhưng nó có khả năng để làm gì đó graphical.target.

[Unit]
After=graphical.target

Một khả năng khác, nếu máy chủ X không khởi động ngay lập tức (tức là bạn có màn hình đăng nhập bằng lightdm hoặc tương tự), thì bạn có thể phải sử dụng WantedBy=...thay thế:

[Unit]
WantedBy=graphical.target

Nếu bạn cảm thấy mệt mỏi khi làm cho nó hoạt động với systemd, bạn có thể muốn xem xét cách thức thông thường mà các nhà quản lý X-Windows làm cho nó hoạt động.

~/.xprofiletập tin, hoạt động như ~/.bashrctập tin.

Ngoài ra còn có các ~/.config/autostart/*.desktoptập tin. Nó sẽ tự động bắt đầu bất cứ ứng dụng nào được xác định trong đó.

Các giải pháp này không phải là hệ thống rộng, tuy nhiên, trong trường hợp bạn có nhiều người dùng, mỗi người sẽ phải có mục riêng. Ngoài ra, nó không khởi động ứng dụng với quyền root mà thay vào đó là bạn.


Như một lưu ý phụ, thông báo "đã tải + không hoạt động (đã chết)" có nghĩa là systemd đã có một thời gian khó khăn để bắt đầu quá trình và kết quả là quyết định từ bỏ nó. Bạn có thể kiểm tra thủ công các name.servicetác phẩm đó khi bạn khởi động lại bằng cách sử dụng:

systemctl stop <service-name>
systemctl start <service-name>

Điều này sẽ làm mới trạng thái và bắt đầu dịch vụ đúng cách, giả sử thông tin là chính xác. Sau đó, bạn có thể kiểm tra lại trạng thái để xem chi tiết bổ sung:

 systemctl status <service-name>

2
Hừm, tôi đã xóa toàn bộ dòng đó và không có gì thay đổi. Ngoài ra, (như tôi đã nói trong câu hỏi của tôi) nó khởi động tốt bằng cách chạy systemctl start emacs).
Bắt đầu

xem câu hỏi cập nhật của tôi Tôi đã có một lỗi đánh máy Documentatin. Gợi ý của bạn về journalctlđã giúp tôi ở đây.
Bắt đầu

0

Đó là một lỗi trong một số tệp dịch vụ của Debian:

# systemctl enable watchdog
Synchronizing state of watchdog.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable watchdog
# find /etc/systemd/ | grep watch
# tail -n2 /lib/systemd/system/watchdog.service

[Install]

https://www.raspberrypi.org/forums/viewtopic.php?f=82&t=218609&p=1406567#p1406567 https://forum.armbian.com/topic/9115-still-dont-ledge-where-to-report -bugs-watchdogservice-từ chối-bắt đầu-do-bị-hỏng-dịch vụ-tập tin /

Sửa lỗi cấp phân phối là

echo "WantedBy=default.target" >> /lib/systemd/system/watchdog.service
systemctl daemon-reexec
systemctl enable watchdog
systemctl stop watchdog.service
systemctl start watchdog.service

Có nhiều lựa chọn thay thế cho việc này.

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.