Mengapa layanan systemd saya yang diaktifkan tidak dapat mulai saat boot?


20

Saya memiliki file unit systemd berikut di /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

Saya ingin ini dimulai saat boot, jadi saya sudah masuk systemctl enable emacs

Namun, setiap kali layanan saya reboot, systemctl status emacsmenunjukkan:

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

Tetapi kemudian memasukkan systemctl start emacsdan memeriksa status kembali:

● 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

Bagaimana saya bisa membuat proses ini berhasil dimulai saat boot?

Jawaban:


9

Saya tidak tahu mengapa tetapi untuk membuatnya bekerja, saya:

dihapus Environment=DISPLAY=:%i

menambahkan sebuah User=variabel

Memastikan file yang benar ada /etc/systemd/system/emacs.service(sebelumnya itu merupakan tautan keras)

dan berlari kembali systemctl enable emacs

Ini membuatnya bekerja.

EDIT Masalah sebenarnya di sini adalah saya salah ketik di baris 3: Documentatin

Saya menemukan ini dengan memeriksa journalctl. Saya menyarankan siapa pun yang memiliki masalah dengan skrip systemd melakukan hal yang sama karena tidak ada kesalahan yang dikirim ke stderr.


Apakah itu juga berfungsi saat reboot? Saya kira jika mode daemon tidak memerlukan koneksi X11, maka tidak perlu untuk yang After=...saya sebutkan.
Alexis Wilke

1
Ya itu berfungsi setelah reboot. Ini bukan Emacs grafis sehingga tidak perlu X11. Itu hanya garis yang saya salin dari contoh dan tidak memperhatikan.
Startec

3

ooh ini menarik.

Memilih unit layanan acak dan menatapnya, itu tergantung pada target tertentu, bukan default.target. Yang terakhir ini simbolis ... tautan yang dikonfigurasi ke target tertentu, secara semantik itu tidak masuk akal. (Lihat systemctl set-default)

Itu mungkin menjelaskan mengapa layanan Anda muncul disabledsetelah Anda mengaktifkannya. Coba ganti default.targetdengan file layanan Anda dengan multi-user.target, misalnya.

(Tidak melaporkan kesalahan ketika gagal mengaktifkan sepertinya cacat pada systemd. Saya hampir bertanya-tanya apakah Anda sekarang memiliki direktori /etc/systemd/system/default.target.wants).


Perintah journalctl memberi tahu Anda apa yang rusak (mengapa diaktifkan gagal, misalnya.) Adapun tautan, itu tidak diperlukan jika Anda membuat layanan pribadi Anda sendiri. Tidak masalah jika Anda membuat paket yang Anda ingin orang lain instal / hapus, dll.
Alexis Wilke

@AlexisWilke Itu akan lebih buruk! Mengapa ditulis untuk melaporkan beberapa kesalahan kepada stderr dan lainnya ke jurnal?
sourcejedi

Itu menulis segalanya untuk jurnal. Dari apa yang saya lihat, Anda hanya melihat kesalahan yang sangat mendasar, spesifik sistem, jika tidak dapat memulai daemon.
Alexis Wilke

2
pengguna bahkan tidak melaporkan kesalahan dasar, mereka percaya operasi telah berhasil dan karena itu melanjutkan untuk reboot. pada nilai nominal, ada cacat pada systemd. Pengguna juga memiliki mode kegagalan, tetapi bagi saya itu tidak terdengar seperti mengabaikan pesan kesalahan yang sangat mungkin dalam pertanyaan ini.
sourcejedi

1
@sourcejedi Saya tidak tahu bagaimana Anda mengetahui hal ini, tetapi ya, saya sekarang memiliki daftar di /etc/systemd/system/default.target.wants Inside yang merupakan file layanan saya. Dan ya, saya tidak tahu ada kesalahan.
Startec

1

Anda memiliki variabel lingkungan DISPLAY, itu berarti Anda ingin memulai X11. Jadi, Anda perlu memiliki cara untuk memblokir layanan Anda sampai saat itu.

Hal ini dilakukan dengan menggunakan satu After=...pilihan .

Saya belum melakukannya sendiri, jadi saya tidak bisa mengatakan itu akan berhasil, tetapi kemungkinan ada hubungannya dengan itu graphical.target.

[Unit]
After=graphical.target

Kemungkinan lain, jika server X tidak langsung mulai (yaitu Anda memiliki layar masuk dengan lightdm atau semacamnya), maka Anda mungkin harus menggunakan WantedBy=...:

[Unit]
WantedBy=graphical.target

Jika Anda bosan menjalankannya dengan systemd, Anda mungkin ingin melihat cara biasa manajer X-Windows membuatnya bekerja.

Ada ~/.xprofilefile, yang berfungsi seperti ~/.bashrcfile.

Ada juga ~/.config/autostart/*.desktopfilenya. Secara otomatis akan memulai aplikasi apa pun yang didefinisikan di sana.

Solusi ini tidak mencakup seluruh sistem, jika Anda memiliki banyak pengguna, masing-masing harus memiliki entri sendiri. Juga, itu tidak memulai aplikasi sebagai root, tetapi Anda, sebagai gantinya.


Sebagai catatan, pesan "dimuat + tidak aktif (mati)" berarti systemd mengalami kesulitan untuk memulai proses dan sebagai hasilnya memutuskan untuk meninggalkannya . Anda dapat menguji secara manual bahwa name.serviceberfungsi setelah Anda reboot menggunakan:

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

Ini akan menyegarkan status dan memulai layanan dengan benar, dengan asumsi info tersebut benar. Anda kemudian dapat memeriksa status lagi untuk melihat detail tambahan:

 systemctl status <service-name>

2
Hm, saya menghapus seluruh baris itu dan tidak ada yang berubah. Juga, (seperti yang saya katakan di pertanyaan saya) itu mulai baik dengan menjalankan systemctl start emacs).
Startec

lihat pertanyaan saya yang diperbarui. Saya salah ketik Documentatin. Petunjuk Anda tentang journalctlmembantu saya di sini.
Startec

0

Ini adalah bug di beberapa file layanan 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-know-where-to-report -bugs-watchdogservice-menolak-untuk-memulai-karena-rusak-layanan-file /

Perbaikan tingkat distribusi adalah untuk

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

Ada banyak alternatif manual untuk ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.