Systemd kullanarak başlangıçta tek bir komutu nasıl çalıştırırım?


113

Aşağıdaki komutu kullanarak önyüklemeden sonra bir Apache Spark kümesini başlatmak istiyorum:

sudo ./path/to/spark/sbin/start-all.sh

Ardından, sistem yeniden başlatmayı / kapanmayı hazırladığında bu komutu çalıştırın:

sudo ./path/to/spark/sbin/stop-all.sh

Nasıl başlayabilirim? Yapabileceğim temel bir şablon var mı?

Son derece basit kullanmaya çalıştım (dosya:) /lib/systemd/system/spark.service:

[Unit]
Description=Spark service

[Service]
ExecStart=sudo ./path/to/spark/sbin/start-all.sh

Bu işe yaramıyor.



Merhaba @WillemK, bu sayfaya zaten bakmıştım. Bulduğum Bu sorun sadece yerini alamaz olduğu execile ExecStart=. Artı, daha önce hiç başlamadım.
macourtney7

1
Komut dosyanızın yolundan önceki nokta çok şüpheli görünüyor.
Andrea Lazzarotto

@AndreaLazzarotto OP'nin senaryoyu OP'nin terminalde yapacağı şekilde çalıştırmaya çalıştığını düşünüyorum ....
George Udosen

Merhaba @AndreaLazzarotto, bu doğru. Herhangi bir karışıklıktan dolayı özür dileriz.
macourtney7

Yanıtlar:


142

Kişisel .servicedosya şu şekilde görünmelidir:

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

Şimdi .servicedosyayı etkinleştirmek ve kullanmak için birkaç adım daha yapın :

  1. Yerleştirin /lib/systemd/systembir isim söylemek ile klasördekimyfirst.service

  2. Komut dosyanızın çalıştırılabilir olmasını sağlayın:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. Başlat:

    sudo systemctl start myfirst
    
  4. Açılışta çalışmasını sağlayın:

    sudo systemctl enable myfirst
    
  5. Yapma:

    sudo systemctl stop myfirst
    

Notlar:

  1. Varsayılan servis kullanıcısı zaten root olduğu için, hizmetinizde Spark'ı sudo ile başlatmanız gerekmez.

  2. Daha fazla systemdseçenek için aşağıdaki bağlantılara bakın .

GÜNCELLEME

Şimdi yukarıda sahip olduğumuz şey sadece ilkel, işte kıvılcım için tam bir kurulum:

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

Hizmeti kurmak için:

sudo systemctl start spark.service
sudo systemctl stop spark.service
sudo systemctl enable spark.service

daha fazla okuma

Lütfen aşağıdaki bağlantıları okuyunuz. Spark karmaşık bir kurulumdur, bu yüzden Ubuntu'nun init servisiyle nasıl bütünleştiğini anlamalısınız.

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7/

https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html


Not edildi ve güncellendi
George Udosen

1
Bunun için, önerdiklerinize dayanarak bir dosya oluşturdum. sudo systemctl start sparkFailed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
Çalıştırma

Ana kısmı systemctl status spark.serviceaşağıdaki gibidir: Executable path is not absolutevespark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7

Sorunlar 1) Kıvılcım ikili yolu (servis dosyasında sahip olduğumuzun yerine geçmelidir) gereklidir, 2) Kıvılcım, kapatma komutunu verir. 3) Size verdiğim bağlantılardan geçtiniz mi? Kıvılcım kullanmıyorum bu yüzden tedarik
George Udosen

? Cevabınız için @GeorgeUdosen sayesinde benim soru soru burada yeniden başlatıldıktan sonra belirli bir komuta altında kıvılcım çalıştırabilirsiniz nasıl askubuntu.com/questions/979498/...
Soheil Pourbafrani

2

Bu, /root/boot.shasgari bir servis dosyası kullanarak önyüklemede (kök olarak) yaratılır ve çalışır :

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

Bunu bir root terminaline Ctrl+ yapabilirsiniz C.

Parametreleri değiştirmek, örneğin farklı kullanmak için $bootscript, bu değişkeni manuel olarak ayarlayın ve komutları kopyalarken bu satırı atlayın.

Komutları çalıştırdıktan sonra, önyükleme komut dosyasını favori düzenleyicinizi kullanarak düzenleyebilirsiniz; bir sonraki önyüklemede çalıştırılır. Ayrıca aşağıdakileri kullanarak hemen çalıştırabilirsiniz:

systemctl start $servicename

Her adım sudo ile yapılabilir, ancak biraz daha karmaşıktır ve bazı sistemlerde sudo kurulu değildir, bu yüzden bazı insanlar kullanmadan önce örneği değiştirmek zorunda kalacaklar. Bu nedenle örnekte sudo içermemeyi seçtim.


Biraz sistemd dokümanlar tarafından kafam karıştı, ancak olmamalı Type=oneshot RemainAfterExit=yesya da özel komut dosyası bazı işlemleri bırakmadığı sürece systemd görevi etkin değil olarak değerlendirir.
Peter Lamberg,

@PeterLamberg Ben de systemd docs okumayı denedim ve yine de ikimiz de;). Çok net olmadıklarını hatırlıyorum, ancak yayınladığım cevap benim için birden fazla sistemde çalışıyor (bu sayfayı her zaman ve tekrar ihtiyacım olduğunda tekrar ziyaret ediyorum). Demek istediğin, 'pasif' olduğu düşünülürse, art arda gelen her 'start' çağrısı betiği yeniden çalıştırır mı? Çünkü bir kabuk betiği için beklendiği gibi düşünürdüm. Tekrar başlatmadan önce gerçekten çalışmayan bir şeyi durdurmak zorunda kalsaydım garip bulurdum.
Luc,
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.