Как запустить одну команду при запуске с использованием 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
файл:
Поместите это в
/lib/systemd/system
папка с произнесением имениmyfirst.service
Сделайте так, чтобы ваш скрипт выполнялся с:
chmod u+x /path/to/spark/sbin/start-all.sh
Начни это:
sudo systemctl start myfirst
Включите его для запуска при загрузке:
sudo systemctl enable myfirst
Останови это:
sudo systemctl stop myfirst
Заметки:
Вам не нужно запускать Spark с sudo в вашем сервисе, так как пользователь сервиса по умолчанию уже root.
Посмотрите на ссылки ниже для более
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://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