Systemd hizmetimin belirli bir kullanıcı tarafından çalıştırılmasını ve başlatılmasının nasıl yapılmasını sağlayabilirim?


132

Ubuntu sunucusundan 14 sürüm 15'e yeni yükselttim. Yükseltme işleminden sonra çalışma komut dosyasını çalıştırırken sorun yaşadım ve systemd'nin yeni varsayılan olduğunu okudum. Linux uzmanı olmaktan uzaktayım, lütfen beni rahat bırak :-)

İşte başlangıç ​​betiğimin önceleri şunlardı:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script

Sistem başlangıcına ve wiki sayfasına dayanarak, yeni systemd servis dosyamdakileri olabildiğince yakından eşlemek için orada verilen tabloları kullandım:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure

Bu dosya yer almaktadır /home/robert/.config/systemd/user/nzbget.service. Hizmeti el ile başlatmak için yapıyorum:

$ systemctl --user start nzbget

Bu harika çalışıyor. Ancak, SSH oturumumdan çıkış yaptığımda, hizmet kapanıyor. Ayrıca, açılışta veya kullanıcı oturum açmada başlamaz. Bir başlangıç ​​hizmeti olarak aynı şekilde davranmasını istiyorum: Önyüklemeden başlamasını, sürekli çalışmasını ve belirli bir kullanıcı olarak çalışmasını istiyorum.

Bu yapılandırmayı almak için ne yapmam gerekiyor?

Yanıtlar:


163

İlk problem

Sen direktifleri belirtebilir User=ve Group=içinde [Service]birim dosyasının bölümüne.

İkinci problem

Hizmetin önyükleme sırasında çalışmasını sağlamak için ana klasörünüze koymamalısınız. Bunun yerine, altına koyun /etc/systemd/system/. Bu, yeni sistem genelinde servisler eklemek için sistem yöneticisi (yani siz) tarafından kullanılması amaçlanan klasördür.

Diğer klasörler şunlardır:

  • /usr/lib/systemd/system/Debian ve Ubuntu altında klasör aslında aslında /lib/systemd/system/çeşitli binve libklasörler /usr/henüz birleşik bir önekle birleştirilmediğinden , birim dosyalarını yüklemek isteyen paketler içindir .
  • /usr/local/systemd/system/ yerel olarak derlenmiş paketlerle birimleri kurmak içindir.

Ünitenin test edilmesi

Birim dosyası uygun bir yere geldiğinde, birimi systemctl start <UNIT_FILENAME>her zamanki gibi yazarak hemen başlatmayı deneyebilirsiniz . Ünitenin tam yolunu yazmak zorunda kalmadan çalışması gerekir. Eklentinin ayrıca belirtilmiş olması gerekmez .service.

Ünitenin etkinleştirilmesi

Ünitenizi etkinleştirmeden önce [Install], yönetmeliği eklemeniz gereken bir bölüm eklemeniz gerekir WantedBy=multi-user.target. Bu yönerge, hizmetin başlatılacağı (etkinleştirilmişse) açılış sürecinin aşamasını belirtir. multi-user.targetçoğu servis için uygundur.

Bu bilgiler eklendikten sonra systemctl enable <UNIT_FILENAME>, üniteyi etkinleştiren sistemi kullanabilirsiniz , bundan sonra sistemi belirtilen aşamada başlatma sırasında otomatik olarak başlatır.


Bu çalıştı. Komutta hizmet dosya adına giden mutlak yolu belirtmek zorunda kaldım systemctl enable, bu ilk başta bana açık değildi. Ayrıca, etkinleştirme bana eksik bir [Install]bölüm hakkında bazı uyarılar verdi . Bunu görmezden geldim, ancak açılışta başlama yeteneğini etkileyip etkilemeyeceğinden emin değilim.
void.pointer 19:15

2
InstallUyarı aslında gerçekten çok önemliydi. Bölüm WantedBy=multi-user.targetaltında olmadan açılışta başlamaz [Install]. Bunu .servicedosyaya ekledikten sonra yapabilirsiniz enable.
void.pointer

4
Cevabı bu kadar uzun süre katılımsız bıraktığım için özür dilerim. Birim dosyasının gitmesi gereken yeri düzelttim, [Install]bölümle ilgili eksik bilgileri ekledim . Umarım şimdi onu arayan herkes için daha yararlıdır.
Yamaho,

5
Servis biçiminde bir dosya adıyla tanımlanır yani kullanıcı adı, şablonu olduğunda bu çok daha kolay hale gelir something@.service, sonra enableisterim something@username.serviceayarı haline gelir User=%ideyişle kullanıcının sabit kodlanmış değildir ve birden çok kullanıcı aynı tanımını kullanabilirsiniz. Bir örnek.
Walf

1
Eğer altına koyarsam başlayacak mı /etc/systemd/user/?
Khurshid Alam,

46

Sistemin "kullanıcı kalıcı" işlevselliğini kullanmak ilginizi çekebilir. Üzerinden etkinleştirilir loginctl enable-linger USERNAME.

İlgili kullanıcının önyüklemede başlatılması için ayrı bir servis yöneticisine neden olur, böylece kullanıcı tanımlı üniteleriniz ~/.config/systemd/userhizmet yapılandırmanıza göre önyükleme ve kapanma saatlerinde alınır ve işlenir.

Ayrıca systemctl --user, sisteminizde değil, kullanıcının servis yöneticisinde çalışacak olan servis (ler) i yönetmek ve yapılandırmak için de kullanabilirsiniz .


6
systemctl --userharika bir bulgu. Teşekkürler!
Anwar

@byteborg Belki de unix.stackexchange.com/questions/409900/… 'e katkıda bulunabilirsiniz ? Kullanıcı hizmetinde PostgreSQL bağımlılığına ihtiyacım var, ancak veritabanı kullanıcının değil bir sistem hizmeti olarak kalıyor.
Michał F

1
Servisler çalıştıktan sonra, kullanıcının servis kayıtlarını görmesine izin verebilecek teknikler var mı? Ayrıcalıklı olmayan bir kullanıcı / var / log / syslog dosyasına erişemez.
mpr

2
systemctl --userAncak SSH oturumları için işe yaramadığını unutmayın .
Mark K Cowan

2
Kabul edilen çözüm olmalı
Drew
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.