Question Planifier le script bash pour une utilisation unique sur OSX


J'essaie de faire un petit script qui, en tant que fonction, prendra un fichier et une date en entrée et supprimera ce fichier à la date spécifiée. Donc, j'en ai seulement besoin pour planifier une seule fois, et c'est tout.

Je suis sur OSX et j'ai regardé à, non seulement j'ai eu des problèmes pour le scripter, mais je comprends (j'ai fait des recherches toute la journée) que des services comme at et cron sera déconseillé sur OSX en faveur de launchd.

De ce que j'ai vu, non seulement le lancement est-il trop compliqué pour cela, mais je n'arrive pas à comprendre comment l'utiliser pour faire une action unique à une heure et une date spécifiques (ce qui est vraiment tout ce dont j'ai besoin).

J'aimerais avoir de l'aide à ce sujet, s'il vous plaît. Je préfère ne pas utiliser àet, idéalement, c'est une solution qui n'exige pas que l'utilisateur installe des éléments supplémentaires. Il doit également être scriptable (donc, ligne de commande). Si je dois utiliser launchd, ainsi soit-il, mais il faut vraiment pouvoir utiliser une date et une heure précises.


3
2018-05-31 18:58


origine


Dans quelle mesure envisagez-vous d’exécuter cette commande à l’avenir? cron ou à sera enlevé? :) Pourquoi ne pas utiliser à? Par défaut, il existe dans toutes les installations osx, donc il n'y a rien de plus à installer par l'utilisateur. - Mxx
Il ne s'agit pas de savoir dans quelle mesure la commande s'exécutera dans le futur, cela dépend de la durée pendant laquelle les utilisateurs peuvent continuer à utiliser le script. J'ai aussi lu ça à Cela a plus d'implications, comme utiliser le disque plus souvent, car il utilise cron qui vérifie les tâches chaque minute, et qu'il peut (par exemple) empêcher le système de passer en mode veille. Comme je l’ai dit, j’ai fait des recherches toute la journée et, idéalement, je n’aurais pas à utiliser à. - user137369
S'il s'agit d'une commande unique, pourquoi vous inquiétez-vous de la durée pendant laquelle vous pourrez continuer à l'utiliser (sans vous disputer, essayez simplement de comprendre pleinement votre situation)? - Mxx
L'idée est que je pourrai l'utiliser plusieurs fois. Expliquant mieux, aujourd'hui je vais lui donner un fichier qu'il va supprimer dans 4 mois, demain je lui donnerai un fichier différent qu'il supprimera dans 7 jours (je choisis le fichier et la date à chaque fois). Chacune de ces suppressions de fichiers est une opération ponctuelle, mais je pense pouvoir utiliser ce script pendant un certain temps, voire même le donner à certains amis. - user137369


Réponses:


Bien sûr, cron et at sont obsolètes, mais ils ne vont probablement pas n'importe où (même s'ils le faisaient, il ne devrait pas être difficile de les réinstaller).

Si vous vouliez vraiment faire cela avec launchd, vous devriez enregistrer et charger une liste de propriétés dans le premier script, puis la décharger et la supprimer dans le second script.

#!/bin/bash

month=6
day=1
hour=18
minute=0
label=com.superuser.431145
agent=~/Library/LaunchAgents/$label.plist

plist="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version=\"1.0\">
<dict>
<key>Label</key>
<string>$label</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/script</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Month</key>
<integer>$month</integer>
<key>Day</key>
<integer>$day</integer>
<key>Hour</key>
<integer>$hour</integer>
<key>Minute</key>
<integer>$minute</integer>
</dict>
</array>
</dict>
</plist>"

echo "$plist" > $agent
launchctl unload $agent 2> /dev/null
launchctl load $agent

Le deuxième script pourrait ressembler à:

plist=~/Library/LaunchAgents/com.superuser.431145.plist
launchctl unload $plist
rm $plist
rm ~/Desktop/test

Si vous avez utilisé à, vous devez d'abord l'activer avec sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist. Voici quelques exemples copiés de mon site web:

echo 'say test' | at now+5 # +5 and +5 seconds don't work
echo 'say test' | at +1 minute # +1 minutes results in an error
echo 'say test' | at +2 hours
echo say test > test.txt; at -f test.txt now+5
atq # at -l; list at queue
atrm 14 # at -d 14
atrm {1..9999} # remove all jobs

2
2018-06-01 15:03



Merci beaucoup, j'avais vraiment besoin de cet exemple, et je pense que si je l'utilise comme base, je pourrai faire le reste. J'espère pouvoir faire des tests dans les prochains jours. Votre approche m'a aussi apporté beaucoup d'idées pour améliorer les scripts précédents que j'ai écrits de manière plus "propre". - user137369
En ce qui concerne la à aspect, vous êtes d'accord sur la simplicité, mais comme je l'ai dit, j'ai quelques soucis, comme toucher le disque beaucoup de fois et peut-être empêcher l'ordinateur de dormir seul. Je voudrais aussi éventuellement partager le script avec plus de gens, et depuis à est désactivé par défaut sur OSX, devant demander à l'utilisateur le mot de passe (depuis launchd doit l’activer une fois en tant que root) ou pour installer des éléments supplémentaires (au cas où à Je pense que cela sera plus difficile pour certains utilisateurs de comprendre la nécessité ou la confiance du script. - user137369