Comment le faire avec systemd
Si vous trouvez ce sujet après juin 2016, Ubuntu et ses dérivés, y compris Mint, utiliseront systemd pour contrôler l'initialisation et l'arrêt du système. J'ai eu des problèmes avec l'ancienne approche, j'ai donc étudié la méthode systémique.
Avec systemd, vous créez un ou deux fichiers pour appeler vos scripts en utilisant les modèles ci-dessous et exécutez une commande. Simple.
Version GUI
Premièrement créez les scripts à exécuter au démarrage et / ou à l’arrêt. J'ai créé .scopening_atstart et .scfullcopy_atend.
Ensuite, assurez-vous qu’ils sont tous deux exécutables en cliquant avec le bouton droit sur le fichier, en sélectionnant les propriétés et en vous assurant que vous avez coché Autoriser l’exécution du fichier en tant que programme.
Les deux fichiers que j'ai créés remplissent et enregistrent le contenu d’un disque virtuel. Ils créent également un fichier dans mon répertoire personnel pour prouver que le service fonctionne. Ils étaient de la forme:
#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time
Ensuite, j'ai ouvert mon gestionnaire de fichiers en tant que root, ouvert /etc/systemd/system
et créé un fichier startup.service et un fichier save-ramdisk.service. Évidemment, vous pouvez choisir vos propres noms et les noms génériques pourraient inclure un fichier de démarrage appelé johns_start.service et un fichier d'arrêt appelé johns_shutdown.service. Il suffit de ne pas choisir les noms de service existants.
[Unit]
Description=Startup Applications
[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart
[Install]
WantedBy=multi-user.target
et
[Unit]
Description=Save Ramdisk to Wine drive C
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend
[Install]
WantedBy=multi-user.target
Vous pouvez utiliser les mêmes fichiers de service, en remplaçant le chemin complet de votre script exécutable par le mien.
Enfin, pour chacun, exécutez la commande systemctl enable your_files_name (mais sans le service de suffixe). Donc mon premier était systemctl enable startup
Redémarrez l'ordinateur une fois pour démarrer les services. Le service de démarrage sera exécuté chaque fois que systemd entre dans la cible multi-utilisateur et le service d'arrêt lorsqu'il quitte la cible multi-utilisateur. Des fichiers de service alternatifs avec des conditions d'activation différentes seront décrits ci-dessous.
Version CLI (ligne de commande)
Cette description suppose que vous opérez depuis votre répertoire personnel plutôt que vers / home / john, utilisez sudo comme vous le souhaitez et l’éditeur de votre choix où j’écris vim ou svim.
Créez des scripts de démarrage et d’arrêt du shell avec la première ligne #!/bin/sh
et rendez-les exécutables avec chmod +x my_new_filename
.
Créez deux fichiers comme ci-dessus ou, dans cet exemple, un fichier pour gérer les tâches de démarrage et d'arrêt. Je vais exécuter des scripts dans mon répertoire personnel, mais @don_crissti a montré des alternatives à Stack Exchange.
svim /etc/systemd/system/start_and_stop.service
et copier le contenu du fichier:
[Unit]
Description=Run Scripts at Start and Stop
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands #your paths and filenames
ExecStop=/home/john/.shutdown_commands
[Install]
WantedBy=multi-user.target
Puis, Activer le service avec la commande:
systemctl enable start_and_stop
et redémarrez votre système après lequel les services seront actifs. Les commandes systemctl is-enabled start_and_stop
et systemctl is-active start_and_stop
peuvent être utilisées pour surveiller vos nouveaux services.
Modification des conditions de déclenchement pour l’arrêt
Les fichiers ci-dessus utilisent tous l’ouverture ou la fermeture de l’environnement multi-utilisateur pour lancer l’exécution des scripts. Le fichier ci-dessous utilise le début de quatre processus d'arrêt potentiels pour lancer ses scripts. Ajouter ou supprimer les cibles sur la ligne Avant + la ligne WantedBy vous permettra de faire des distinctions plus fines:
Ce fichier a été proposé dans une réponse à Unix & amp; Linux par @Matthias mais je n'ai pas pu l'exécuter tant que j'ai ajouté une section d'installation.
Encore une fois, éditez le script dans /etc/systemd/service/
et activez-le en utilisant systemctl enable your_file_name
. Lorsque j'ai modifié les cibles, j'ai utilisé la commande systemclt disable file_name
, puis l'ai réactivée pour la relier aux répertoires cibles. Redémarrez et le service fonctionnera.
[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
# executed before the target state is entered
# Also consider kexec.target
[Service]
Type=oneshot
ExecStart=/home/john/.my_script #your path and filename
[Install]
WantedBy=halt.target reboot.target shutdown.target