Etkinleştirilmiş sistem hizmeti neden önyüklemede başlamıyor?


20

Aşağıdaki systemd birim dosyası var /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

Bunun önyüklemede başlamasını istiyorum, bu yüzden girdim systemctl enable emacs

Ancak, hizmetim her yeniden başlatıldığında şunu systemctl status emacsgösterir:

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

Ama sonra systemctl start emacsdurumu girip kontrol etmek döndürür:

● 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

Bu işlemin önyüklemede başarıyla başlatılmasını nasıl sağlayabilirim?

Yanıtlar:


9

Neden diye bir fikrim yok ama bunu işe almak için ben:

silindi Environment=DISPLAY=:%i

bir User=değişken ekledi

Doğru dosyanın bulunduğundan emin olun /etc/systemd/system/emacs.service(daha önce sabit bir bağlantı olmuştu)

ve yeniden koştu systemctl enable emacs

Bu işe yaradı.

EDIT Burada asıl sorun, satır 3'te bir yazım hatası vardı: Documentatin

Bunu kontrol ederek buldum journalctl. Ben bir systemd betiği ile sorunları olan herkes stderr gönderilen hiçbir hata olduğu gibi aynı şeyi öneririz.


Bu aynı zamanda yeniden başlatma üzerinde de çalışır mı? Bence daemon modu X11 bağlantısı gerektirmiyorsa, After=...bahsettiğim I'e gerek yok .
Alexis Wilke

1
Evet, yeniden başlattıktan sonra çalışır. Bu grafiksel bir Emac değildir, bu nedenle X11 gerekmez. Bu sadece bir örnekten kopyaladığım bir satırdı ve dikkat etmedi.
Startec

3

ooh bu ilginç.

Rastgele bir servis birimi seçmek ve ona bakmak, bunun yerine belirli bir hedefe bağlıdır default.target. İkincisi semboliktir ... belirli bir hedefe yapılandırılmış bir bağlantı, anlamsal olarak mantıklı değildir. (Bkz. systemctl set-default)

Bu, hizmetinizin disabledetkinleştirildikten sonra neden gösterildiğini açıklayabilir . Örneğin, default.targetservis dosyanızda değiştirmeyi deneyin multi-user.target.

(Etkinleştirme başarısız olduğunda bir hata bildirmemek systemd'de bir kusur gibi görünüyor. Neredeyse bir dizininiz olup olmadığını merak ediyorum /etc/systemd/system/default.target.wants).


Journalctl komutu, neyin kırıldığını söyler (örneğin, etkinleştirmenin neden başarısız olduğu.) Bağlantıya gelince, kendi kişisel hizmetinizi oluşturmanız gerekmez. Başkalarının yüklemesini / kaldırmasını vb. İstediğiniz bir paket oluşturmanızın önemi vardır
Alexis Wilke

@AlexisWilke Bu daha da kötü olurdu! Neden bazı hataları stderr'a ve bazılarını dergiye rapor etmek için yazılsın?
sourcejedi

Her şeyi dergiye yazar. Gördüğüm kadarıyla, yalnızca arka plan programını başlatamadığında çok temel, sistemd'e özgü bir hata görüyorsunuz.
Alexis Wilke

2
kullanıcı temel bir hata bile rapor etmedi, işlemin başarılı olduğuna inandılar ve bu nedenle yeniden başlatmaya devam ettiler. nominal değerde sistemde bir kusur vardır. Kullanıcıların da hata modları var, ancak bana bu soruda bir hata mesajını tamamen gözden kaçırmak gibi görünmüyordu.
sourcejedi

1
@sourcejedi Bunu nasıl bildiğinize dair hiçbir fikrim yok ama evet, şimdi /etc/systemd/system/default.target.wants içeride bir hizmetim var. Ve evet, herhangi bir hata olduğu hakkında hiçbir fikrim yoktu.
Startec

1

Bir DISPLAY ortam değişkeniniz var, bu da X11'in başlatılmasını istediğiniz anlamına geliyor. O zamana kadar hizmetinizi engellemenin bir yoluna ihtiyacınız var.

Bu kullanılarak yapılır seçeneği .After=...

Kendim yapmadım, bu yüzden işe yarayacağını söyleyemem, ancak muhtemelen bununla ilgili bir şey graphical.target.

[Unit]
After=graphical.target

Başka bir olasılık, X sunucusu hemen başlamazsa (yani lightdm veya benzeri bir giriş ekranınız varsa), WantedBy=...bunun yerine şunları kullanmanız gerekebilir :

[Unit]
WantedBy=graphical.target

Systemd ile çalışmaktan yorulduysanız, X-Windows yöneticilerinin normal şekilde çalışmasını sağlamak isteyebilirsiniz.

Orada ~/.xprofilegibi çalışır dosya, ~/.bashrcdosyaya.

Orada da ~/.config/autostart/*.desktopdosyaları. Orada tanımlanan uygulamaları otomatik olarak başlatır.

Bu çözümler sistem çapında değildir, ancak birden fazla kullanıcınız olması durumunda her birinin kendi girişi olmalıdır. Ayrıca, uygulamayı kök olarak başlatmaz, bunun yerine siz.


Bir yan not olarak, "yüklü + inaktif (ölü)" mesajı, systemd'in işlemi başlatmak için zor zamanları olduğu ve sonuç olarak onu terk etmeye karar verdiği anlamına gelir. Aşağıdakileri name.servicekullanarak yeniden başlattığınızda manuel olarak çalışıp çalışmadığını test edebilirsiniz :

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

Bu , bilgilerin doğru olduğunu varsayarak durumu yenileyecek ve hizmeti düzgün başlatacaktır. Daha sonra, ek ayrıntıları görmek için durumu tekrar kontrol edebilirsiniz:

 systemctl status <service-name>

2
Hm, tüm çizgiyi sildim ve hiçbir şey değişmedi. Ayrıca, (sorumda söylediğim gibi) systemctl start emacs çalıştırarak iyi başlar).
Startec

güncellenmiş soruma bakın. Bir yazım hatası vardı Documentatin. Bununla ilgili journalctlipucun bana burada yardımcı oldu.
Startec

0

Debian'ın çeşitli hizmet dosyalarında bir hata var:

# 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-reddediyor-başlangıç-sebebiyle-to-kırık-servis-dosyası /

Dağıtım seviyesi düzeltmesi

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

Buna birçok manuel alternatif var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.