web-dev-qa-db-fra.com

Comment exécuter une seule commande au démarrage à l'aide de systemd?

Je souhaite démarrer un cluster Apache Spark après le démarrage à l'aide de la commande suivante:

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

Exécutez ensuite cette commande lorsque le système se prépare à redémarrer/arrêter:

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

Comment puis-je commencer? Existe-t-il un modèle de base sur lequel je peux construire?

J'ai essayé d'utiliser un extrêmement simple (fichier: /lib/systemd/system/spark.service):

[Unit]
Description=Spark service

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

Ce qui ne marche pas.

92
macourtney7

Votre fichier .service devrait ressembler à ceci:

[Unit]
Description=Spark service

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

[Install]
WantedBy=multi-user.target

Maintenant, effectuez quelques étapes supplémentaires pour activer et utiliser le fichier .service:

  1. Placez-le dans le dossier /lib/systemd/system avec un nom de myfirst.service

  2. Faites que votre script soit exécutable avec:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. Commencez le:

    Sudo systemctl start myfirst
    
  4. Autorisez-le à s'exécuter au démarrage:

    Sudo systemctl enable myfirst
    
  5. Arrête ça:

    Sudo systemctl stop myfirst
    

Remarques:

  1. Vous n'avez pas besoin de lancer Spark avec Sudo dans votre service, car l'utilisateur du service par défaut est déjà root.

  2. Consultez les liens ci-dessous pour plus d'options systemd.

METTRE À JOUR

Maintenant, ce que nous avons ci-dessus est simplement rudimentaire, voici une configuration complète pour 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

Pour configurer le service:

Sudo systemctl start spark.service
Sudo systemctl stop spark.service
Sudo systemctl enable spark.service

Lectures complémentaires

Veuillez lire les liens suivants. Spark est une configuration complexe, vous devez donc comprendre comment elle s'intègre au service init d'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

113
George Udosen

Cela crée et exécute /root/boot.sh au démarrage (en tant que root) à l'aide d'un fichier de service minimal:

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

Vous pouvez Ctrl+C ceci dans un terminal root.

Pour modifier les paramètres, par exemple pour utiliser un $bootscript différent, définissez cette variable manuellement et ignorez simplement cette ligne lors de la copie des commandes.

Après avoir exécuté les commandes, vous pouvez éditer le script de démarrage à l’aide de votre éditeur favori et le lancer au prochain démarrage. Vous pouvez aussi le lancer immédiatement en utilisant:

systemctl start $servicename

Toutes les étapes peuvent être réalisées avec Sudo, mais la procédure est un peu plus compliquée et, dans certains systèmes, aucune installation de Sudo n’est installée; certaines personnes doivent donc modifier cet exemple avant de l’utiliser. Par conséquent, j'ai choisi de ne pas inclure Sudo dans l'exemple.

0
Luc