Dans le cadre d'un script légèrement complexe, je dois dire à un serveur de lancer une simulation. Normalement, j'y arriverais en faisant ssh user@server 'simulation/script'
. Cependant, cela garderait la session ssh en vie jusqu'à ce que 'simulation/script'
soit terminé, ce qui n'est pas souhaitable pour moi.
J'ai récemment appris l'existence de la commande at
et elle semble bien s'intégrer à mon problème.
Ce que je veux faire maintenant, c'est de ssh sur mon serveur et at
mon script de simulation s'exécute en 5 secondes (plus que suffisant pour que la connexion ssh soit fermée). Ainsi, une fois la connexion ssh fermée dans les 5 secondes, le serveur démarrera la simulation sans avoir besoin de la connexion ssh pour rester active.
Ce qui me pose problème, c'est l'expression temporelle dont at
a besoin pour planifier un travail "dans 5 secondes".
J'ai essayé les expressions de temps suivantes, qui me donnent toutes des erreurs:
now + 5 seconds
now + 5 sec
now + 5 s
now + 5seconds
now + 5sec
now + 5 s
now+5sec
now+5seconds
now+5s
Comment puis-je obtenir ma at
pour exécuter ma commande "dans 5 secondes"?
Il n'y a pas de secondes à l'adresse:
man at
a déclaré:
- la spécification d'une date doit suivre la spécification de l'heure. Vous pouvez aussi donner des temps comme maintenant + compter les unités de temps, où les unités de temps peuvent être des minutes, des heures, des jours ou des semaines et vous pouvez indiquer at pour exécuter le travail aujourd'hui en ajoutant le suffixe aujourd'hui et pour exécuter le travail demain en ajoutant le suffixe demain.
Donc, au lieu de at
, vous pourriez utiliser un sleep
je pense.
Voir man 1 sleep
Si vous souhaitez exécuter ssh user@server 'simulation/script'
sans attendre, faites simplement:
ssh user@server 'simulation/script' &
la commande sera exécutée en arrière-plan.
De plus, comme l'a dit Rawkode, Nohup
y aidera.
Alors finalement:
Nohup ssh user@server 'simulation/script' &
avec Nohup, vous pouvez quitter votre terminal et activer le processus ssh
.
EDIT
: si vous voulez exécuter la commande ssh
et fermer la connexion:
ssh user@server 'simulation/script &'
"at" n'a pas une résolution inférieure à la minute mais vous pouvez le simuler:
echo "sleep 5 ; COMMAND" | at now
at
n'utilise pas les secondes, seulement les minutes/heures/jours
Ce que vous pouvez faire est de faire précéder votre script de Nohup
, ce qui garantit que le script n'est pas tué lorsque vous déconnectez votre session SSH.
ssh server 'Nohup yourscript.sh &'
NOTE: Après avoir joué avec ce qui précède, la connexion SSH doit être supprimée manuellement.
Une autre alternative serait screen
screen -d -m yourscript.sh
Cela lancera un processus screen
détaché auquel vous pourrez vous reconnecter à tout moment.
NOTE: J'ai testé cela avec le script et la commande suivants et cela a parfaitement fonctionné.
Commande SSH
ssh server.com 'screen -d -m ~/myscript.sh'
myscript.sh
#!/bin/sh
sleep 10
echo "hello world" > /tmp/hello
exit;
Juste pour noter: dans man at
, j'ai vu qu'il y avait un commutateur -t
qui accepterait les dates avec des secondes - mais malheureusement les secondes seront tronquées:
$ date; date --date="now +10 seconds" +"%m%d%H%M.%S"; echo "logger AAAA" | at -t $(date --date="now +5 seconds" +"%Y%m%d%H%M.%S")
Thu Feb 5 14:45:57 CET 2015
02051446.07
warning: commands will be executed using /bin/sh
job 8 at Thu Feb 5 14:46:00 2015
... et le travail peut en fait être planifié dans le passé (également utilisé avec logger
dans syslog, car il ne semble pas que l'écho sur la sortie standard des terminaux puisse fonctionner à partir d'ici)
La redirection de stdin/stdout/stderr en plus de l’arrière-plan du script permettra à la session SSH de se fermer immédiatement après l’exécution de la commande en arrière-plan:
ssh hostname "/path/to/script </dev/null >/dev/null 2>/dev/null &"
Source: https://serverfault.com/a/36436/138334 .
Je pense que c'est beaucoup plus facile à faire:
sleep n && command
où n
est le nombre de secondes.
J'ai rencontré le même problème aujourd'hui, mais j'ai pu le résoudre en utilisant Nohup
Nohup bash -c 'sleep 5 && at now -f script-name.sh'
Vous pouvez le faire en utilisant la commande sleep comme ça:
bash -c 'sleep 5 ; echo "test"' &