Як запустити одну команду при запуску за допомогою systemd?


113

Я хотів би запустити кластер Apache Spark після завантаження за допомогою наступної команди:

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

Потім запустіть цю команду, коли система готується до перезавантаження / відключення:

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

Як я можу почати роботу? Чи є базовий шаблон, на якому я можу будуватись?

Я намагався використовувати надзвичайно простий (файл /lib/systemd/system/spark.service:):

[Unit]
Description=Spark service

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

Що не працює.


Подивіться на: wiki.ubuntu.com/SystemdForUpstartUsers

Привіт @WillemK, я вже переглянув цю сторінку. Це питання я знайшов , що я не можу просто замінити execз ExecStart=. Плюс до цього я раніше не використовував старт.
macourtney7

1
Крапка перед шляхом вашого сценарію виглядає надзвичайно підозрілою.
Андреа Лацаротто

@AndreaLazzarotto Я думаю, що ОП намагається запустити сценарій так, як ОП буде в терміналі, отже ....
Джордж Удосен,

Привіт @AndreaLazzarotto, це правильно. Вибачте за будь-яке сприйняття сум'яття
macourtney7

Відповіді:


142

Ваш .serviceфайл повинен виглядати так:

[Unit]
Description=Spark service

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

[Install]
WantedBy=multi-user.target

Тепер виконайте ще кілька кроків для ввімкнення та використання .serviceфайлу:

  1. Помістіть його в /lib/systemd/systemпапку з вимовою іменіmyfirst.service

  2. Зробіть так, щоб ваш сценарій виконувався за допомогою:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. Почніть це:

    sudo systemctl start myfirst
    
  4. Увімкніть його для запуску під час завантаження:

    sudo systemctl enable myfirst
    
  5. Зупини це:

    sudo systemctl stop myfirst
    

Примітки:

  1. Вам не потрібно запускати Spark з sudo у вашій службі, оскільки користувач сервісу за замовчуванням вже root.

  2. Перегляньте посилання нижче для отримання додаткових systemdваріантів.

ОНОВЛЕННЯ

Тепер, що ми маємо вище, є просто рудиментарним, ось повне налаштування для іскри:

[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

Щоб налаштувати послугу:

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

Подальше читання

Прочитайте наступні посилання. Іскра - це складне налаштування, тому ви повинні зрозуміти, як вона інтегрується в службу init Ubuntu.

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



1
Дякую за це, я створив файл на основі запропонованих вами пропозицій. Після запуску sudo systemctl start sparkотримують таку помилку:Failed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
macourtney7

Основна частина такої systemctl status spark.service: Executable path is not absoluteіspark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7

Питання: 1) Необхідний бінарний шлях іскри (повинен замінити те, що ми маємо в сервісному файлі); 2) Spark має команду вимкнення, що це таке. 3) Ви перейшли за посиланнями, які я вам дав. Я не використовую іскри, тому
постачайте

@GeorgeUdosen Спасибі за вашу відповідь, моє запитання полягає в тому, як я можу запустити іскру під певною командою після перезавантаження? Питання тут askubuntu.com/questions/979498/…
Soheil Pourbafrani

2

Це створюється і запускається /root/boot.shпід час завантаження (як root), використовуючи мінімальний файл обслуговування:

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

Ви можете Ctrl+ Cце до кореневого терміналу.

Щоб змінити параметри, наприклад використовувати інший $bootscript, встановіть цю змінну вручну та просто пропустіть цей рядок під час копіювання команд.

Після запуску команд ви можете відредагувати сценарій завантаження за допомогою улюбленого редактора, і він запуститься при наступному завантаженні. Ви також можете негайно запустити його, скориставшись:

systemctl start $servicename

Кожен крок можна зробити з sudo, але це трохи складніше, а деякі системи не мають встановленого sudo, тому деяким людям доведеться змінювати приклад перед використанням. Тому я вирішив не включати судо в приклад.


Я трохи заплутався у systemd-документах, але чи не так, Type=oneshot RemainAfterExit=yesчи systemd вважатиме задачу неактивною, якщо спеціальний скрипт не залишить запущеними деякі процеси.
Пітер Ламберг

@PeterLamberg Я також спробував читати systemd документи, і все ж тут ми обидва;). Я пам’ятаю, що вони були не дуже зрозумілі, але відповідь, яку я розмістив, працює для мене на багатьох системах (я переглядаю цю сторінку раз у раз, коли мені це потрібно знову). Ви маєте на увазі це, оскільки вважається "неактивним", кожен наступний дзвінок "Пуск" повторно запустить сценарій? Тому що я вважав би це так, як очікувалося для сценарію оболонки. Мені було б дивно, якби мені довелося «зупинити» щось, що насправді не працює, перш ніж я можу його запустити заново.
Люк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.