J'utilise une machine Windows comme serveur ssh. Je veux exécuter à distance certaines tâches qui prennent plusieurs heures pour se terminer. Existe-t-il un moyen d'avoir un processus persistant même après la déconnexion de la session ssh distante dans Powershell ?
Réponses
Trop de publicités?Après quelques expérimentations, j'ai remplacé ssh par PowerShell Remoting.
En particulier, la section DÉMARRER UNE TÂCHE À DISTANCE QUI GARDE LES RÉSULTATS SUR L'ORDINATEUR À DISTANCE de l'application about_Remote_Jobs a été très utile.
En gros, mon flux de travail actuel est le suivant
- Ouvrir une nouvelle PSSession
- Invoquer une commande (
Invoke-Command
) sur le serveur distant comme un travail, avecStart-Job
Je peux alors librement me déconnecter de la session et me reconnecter plus tard à la session et obtenir les résultats du travail avec Receive-Job
.
Utilisez le paramètre RunasJob via un PSSession :
(extrait de l'aide about_remote_jobs)
LANCER UN TRAVAIL À DISTANCE QUI RENVOIE LES RÉSULTATS À L'ORDINATEUR LOCAL (ASJOB)
Pour lancer une tâche d'arrière-plan sur un ordinateur distant qui renvoie l'icône les résultats de la commande à l'ordinateur local, utilisez le paramètre AsJob d'un cmdlet, tel que le cmdlet Invoke-Command.
Lorsque vous utilisez le paramètre AsJob, l'objet du travail est en réalité créé sur l'ordinateur local, même si le travail s'exécute sur l'ordinateur distant. ordinateur distant. Lorsque le travail est terminé, les résultats sont résultats sont renvoyés à l'ordinateur local.
Vous pouvez utiliser les cmdlets qui contiennent le nom Job (les cmdlets Job) pour gérer tout travail créé par n'importe quelle cmdlet. La plupart des cmdlets qui paramètres AsJob n'utilisent pas le remoting de Windows PowerShell.
vous pouvez les utiliser même sur des ordinateurs qui ne sont pas configurés pour
remoting et qui ne répondent pas aux exigences du remoting.ÉTAPE 1 : INVOKE-COMMAND -ASJOB
La commande suivante utilise le paramètre AsJob de Invoke-Command pour démarrer un travail en arrière-plan sur l'ordinateur Server01. Le travail exécute une commande Get-Eventlog qui récupère les événements dans le journal du système. Vous pouvez utiliser pouvez utiliser le paramètre JobName pour attribuer un nom d'affichage à la tâche.
invoke-command -computername Server01 -scriptblock {get-eventlog system} -asjob
Les résultats de la commande ressemblent à l'exemple de sortie suivant.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 get-eventlog system
Lorsque le paramètre AsJob est utilisé, Invoke-Command renvoie le même résultat que le paramètre AsJob. type d'objet de travail que celui renvoyé par Start-Job. Vous pouvez enregistrer l'objet dans une variable, ou vous pouvez utiliser une commande Get-Job pour obtenir le travail.
Notez que la valeur de la propriété Location indique que le travail a été exécuté. sur l'ordinateur Server01.
ÉTAPE 2 : TROUVER UN EMPLOI
Pour gérer un travail démarré à l'aide du paramètre AsJob de la commande Invoke-Command, utilisez les cmdlets Job. Comme l'objet de travail qui représente le travail distant se trouve sur l'ordinateur local, il n'est pas n'avez pas besoin d'exécuter des commandes distantes pour gérer le travail.
Pour déterminer si le travail est terminé, utilisez la commande Get-Job. La commande suivante permet d'obtenir tous les travaux qui ont été lancés dans la session en cours.
get-job
Parce que le travail à distance a été lancé dans la session en cours, un travail local Get-Job locale permet d'obtenir le travail. La propriété State de l'objet job indique que la commande a été exécutée avec succès.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 get-eventlog system
ÉTAPE 3 : RECEVOIR LE TRAVAIL
Pour obtenir les résultats du travail, utilisez le cmdlet Receive-Job. Comme les résultats du travail sont automatiquement renvoyés à l'ordinateur sur lequel réside l'ordinateur où réside l'objet du travail, vous pouvez obtenir les résultats avec une commande locale commande locale Receive-Job.
La commande suivante utilise le cmdlet Receive-Job pour obtenir l'adresse de l'entreprise. résultats de la tâche. Elle utilise l'ID de session pour identifier le travail. Cette commande enregistre les résultats du travail dans la variable $results. Vous pouvez consulter le site pouvez également rediriger les résultats vers un fichier.
$results = receive-job -id 1
Ce que vous recherchez, ce sont des PSSessions.
Extrait de la page about_pssessions sur technet ( http://technet.microsoft.com/en-us/library/hh847839.aspx )
Cependant, contrairement à la session qui démarre automatiquement, vous pouvez contrôler les PSSessions que vous créez. Vous pouvez les obtenir, les créer, les configurer et les supprimer, vous déconnecter et vous reconnecter à elles, et exécuter plusieurs commandes dans la même PSSession. La PSSession reste disponible jusqu'à ce que vous la supprimiez ou qu'elle s'arrête.
Comme le PO utilise ssh pour se connecter à Powershell à partir d'une machine non Windows, il ne peut pas utiliser de sessions Powershell. Il doit l'exécuter comme s'il était connecté à la machine locale. Le cmdlet Start-Job devrait faire l'affaire :
Start-Job -scriptblock {script ou commande que vous souhaitez exécuter comme job}