Как запустить одну команду при запуске с использованием systemd?

Я хотел бы запустить кластер 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

Который не работает.

3 ответа

Решение

Ваш .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 опции.

ОБНОВИТЬ

Теперь то, что мы имеем выше, просто зачаточно, вот полная настройка для spark:

[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

дальнейшее чтение

Пожалуйста, прочитайте следующие ссылки. Spark - сложная установка, поэтому вы должны понимать, как она интегрируется с сервисом инициализации 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

Это создает и работает /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 не установлен, поэтому некоторым людям придется изменить пример перед использованием. Поэтому я решил не включать sudo в пример.

Добавление элементов автозагрузки в systemd сложно и обременительно. Чтобы сделать это более удобным, я написал инструмент add_service , который предоставляет простой способ быстро добавить элемент автозагрузки в systemd.

Установить:

      pip3 install add_service

Применение:

      python -m add_service [shell_file/cmd] [user (default `whoami`)]

Примеры:

      python -m add_service ssh_nat.sh  # by default user is `whoami`
python -m add_service "`which python3` -m http.server 80" root
Другие вопросы по тегам