systemd servisi manuel olarak başlayacak ancak açılışta başlamıyor?


4

Raspberry Pi'mde yer kontrolüne başlamak için bir systemd servisi yazdım.

[Unit]
Description=Groundcontrol status monitor

[Service]
ExecStart=/opt/groundcontrol/groundcontrol/start.sh
Type=forking

[Install]
WantedBy=multi-user.target  

Komut dosyasını kullanıyorum, çünkü yer denetimi bin dizininden başlatılmadıkça düzgün çalışmayacak. İşte script:

cd /opt/groundcontrol/groundcontrol
./groundcontrol &

Bu, manuel olarak başlattığımda mükemmel çalışıyor, ancak Pi'imi başlatıp çalıştırdığımda systemctlbaşarısız olduğunu söylüyor. systemctl status groundcontrol.servicebaskılar

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: failed (Result: exit-code) since Wed 1969-12-31 17:00:14 MST; 43 years 11 months ago
  Process: 111 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 116 (code=exited, status=2)

Dec 31 17:00:11 waldo systemd[1]: Starting Groundcontrol status monitor...
Dec 31 17:00:12 waldo systemd[1]: Started Groundcontrol status monitor.
Dec 31 17:00:14 waldo systemd[1]: groundcontrol.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Dec 31 17:00:14 waldo systemd[1]: Unit groundcontrol.service entered failed state. 

Manuel olarak çalıştırdığımda durum

groundcontrol.service - Groundcontrol status monitor
   Loaded: loaded (/etc/systemd/system/groundcontrol.service; enabled)
   Active: active (running) since Thu 2013-12-26 15:38:02 MST; 1s ago
  Process: 296 ExecStart=/opt/groundcontrol/groundcontrol/start.sh (code=exited, status=0/SUCCESS)
 Main PID: 297 (groundcontrol)
   CGroup: /system.slice/groundcontrol.service
           `-297 ./groundcontrol

Dec 26 15:38:02 waldo systemd[1]: Started Groundcontrol status monitor. 

Groundcontrol ile sağlanan bir System V init betiği vardı ancak bunu systemd ile nasıl kullanacağımı bilmiyordum - bu mümkün mü ve hizmetimden daha iyi çalışacak mı? Değilse, bu servisi nasıl düzeltebilirim? Teşekkürler.


groundcontrolÖnyükleme işleminde doğru şekilde sipariş verebilmeniz için gereksinimlerini ve gereksinimlerini anlamanız gerekir .
Pavel Šimerda

Yanıtlar:


4

Kayıtlar şöyle diyor:

main process exited, code=exited, status=2/INVALIDARGUMENT

Bu, sorunun groundcontrolkendisiyle olduğu anlamına gelir ; durum 2’yi (bir tür başarısızlık) döndürdü.

Genellikle bu belirli sorun - yalnızca önyüklemede hizmet başarısız oluyor - hizmetin çok erken başlaması , yani sistem tarafından henüz keşfedilmemiş bazı donanım aygıtları gerektirmesi nedeniyle ortaya çıkar. (Modern Linux sistemlerinde pratik olarak tüm cihazların dinamik olarak keşfedildiğini unutmayın; "ah, tüm cihazlara sahibim, başlayalım" diyen bir nokta yoktur .)

Çözüm, libudev kullanmak ve dinamik olarak aygıt eklemek için programı yeniden yazmak olacaktır.

Çözüm, servisi belirli bir cihazdan sonra sipariş etmek (hangi cihaza ihtiyaç duyduğumu bilmiyorum, bu yüzden tam bir cevap veremiyorum) veya systemd-udev-settle.serviceudev'in ilk işleyene kadar bekleyeceği süreyi almak için Wants = + After = kullanmak gerekir. "yeni cihaz" olaylarının toplamı.


Ayrıca, neden .shsadece bir dizine cd'leme yapmak için ayrı bir senaryo var ? WorkingDirectory=+ Type=simpleyeterli olacaktır. (Ayrıca &, sistemin kendisi - bir servis yöneticisi olmak - "arka planda" her şeyi çalıştırdığı için de gereksizdir.)


1
Bununla birlikte gelen init betiğinde (başlangıç ​​için öyleydi, bu yüzden onu kullanamam) # Required-Start: $local_fs $network $remote_fs. Bu, başlamadan önce local_fs, network ve remote_fs cihazlarını kontrol etmem gerektiği anlamına mı geliyor? Bunu init işinde yapmanın bir yolu var mı, yoksa sadece After = kullanıyorum mu?
Lily Hahn

Ekledim Requires=systemd-udev-settle.service After=systemd-udev-settle.serviceve her şey yoluna başladı ve başarısız oldu. İşte durum: pastebin.com/kYietiVA
Lily Hahn

Yapıştırma servislerini kullanmak yerine soruyu düzenleyin. Önceden sed 's/^/ /biçimlendirilmiş bir blokta görünmelerini sağlamak için satırları basitçe yapabilirsiniz.
Pavel Šimerda
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.