Как мне запустить одну команду при запуске с помощью 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

Что не работает.

Ваш .service файл должен выглядеть следующим образом:

[Unit]Description=Spark service[Service]ExecStart=/path/to/spark/sbin/start-all.sh[Install]WantedBy=multi-user.target

Теперь выполните еще несколько шагов, чтобы включить и использовать .service файл:

  1. Поместите его в /etc/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 ServersAfter=network.targetAfter=systemd-user-sessions.serviceAfter=network-online.target [Service]User=sparkType=forkingExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.shExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.shTimeoutSec=30Restart=on-failureRestartSec=30StartLimitInterval=350StartLimitBurst=10 [Install]WantedBy=multi-user.target

Чтобы настроить службу:

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

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

Пожалуйста, ознакомьтесь со следующими ссылками. Spark - это сложная настройка, поэтому вы должны понимать, как она интегрируется со службой инициализации Ubuntu.

Скопируйте и вставьте это в терминал (как root), чтобы создать /root/boot.sh и запустите его при загрузке:

bootscript=/root/boot.shservicename=custombootcat > $bootscript <<EOF#!/usr/bin/env bashecho "$bootscript ran at \$(date)!" > /tmp/it-worksEOFchmod +x $bootscriptcat > /etc/systemd/system/$servicename.service <<EOF[Service]ExecStart=$bootscript[Install]WantedBy=default.targetEOFsystemctl enable $servicename

Для изменения параметров, например, для использования другого $bootscript, просто установите эту переменную вручную и пропустите эту строку при копировании команд.

После выполнения команд вы можете редактировать /root/boot.sh используя ваш любимый редактор, и он будет запущен при следующей загрузке. Вы также можете немедленно запустить его, используя:

systemctl start $servicename

Точка перед путем вашего скрипта выглядит крайне подозрительно.

Привет @WillemK, я уже просматривал эту страницу. Эта проблема, которую я обнаружил, заключается в том, что я не могу просто заменить exec на ExecStart=. Кроме того, я раньше не использовал upstart.

Взгляните на: SystemdForUpstartUsers - Ubuntu Wiki

@AndreaLazzarotto Я думаю, что OP пытается запустить скрипт так, как это сделал бы OP в терминале, отсюда и .

Привет @AndreaLazzarotto, это правильно. Приносим извинения за возникшую путаницу.

@George да, я тоже так думаю, однако использование относительных путей в сервисах может привести к ошибкам из-за другого ПУТИ. Я предлагаю вместо этого использовать абсолютные пути.

@AndreaLazzarotto, я пытался использовать абсолютный путь, но, как вы можете видеть в моем ответе на данный ответ, я получаю ошибку абсолютного пути. Файл .sh находится по адресу `/usr/lib/spark-2.1/sbin/start-all.sh - и это то, что я вам предоставил. Разве это не абсолютный путь?

@macourtney7 смотрите мое обновление и ссылку на рабочий учебник с более подробными опциями для systemd