Quel est l'équivalent de «nohup» dans Linux PowerShell?

Nov 06 2020

Je connais très bien l'existence d'une question en double . Mais cette question est marquée comme réponse et je ne pense pas qu'elle réponde du tout à la question initiale.

La $ nohup commandcommande continue à exécuter même si le processus parent (shell) de nohup meurt. Plus d'informations ici: Quelle est la différence entre nohup et esperluette .

Dans le cas de l'api Win32, je vois la ligne Lorsque le système met fin à un processus, il ne met fin à aucun processus enfant créé par le processus. L'arrêt d'un processus ne génère pas de notifications pour les procédures de hook WH_CBT. . C'est le comportement souhaité dont je parle. Cela fonctionne automatiquement avec win32 powershell. Mais avec Linux PowerShell, Start-Jobc'est simplement un travail d'arrière-plan dans le contexte de PowerShell dans le sens où il est tué lorsque PowerShell est tué.

Exemple:

➜  ~ powershell-preview -c "Start-Job { /bin/sleep 1000 }"

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
1      Job1            BackgroundJob   Running       True            localhost             /bin/sleep 1000

➜  ~ ps ux  | grep sleep
mvaidya   166986  0.0  0.0   9032   664 pts/11   S+   18:59   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox sleep

Réponses

2 mklement0 Nov 06 2020 at 09:23

L'utilisation de l' opérateur d'arrière-plan deStart-Job PowerShell v6 + n'est pas une option, car l'arrêt du travail mettra également fin aux processus enfants lancés à partir de celui-ci, quels travaux sont - à la fois sur Windows et sur des plates-formes de type Unix .&

Cependant, vous pouvez obtenir un nohupcomportement similaire via l' Start-Processapplet de commande:

Sur les plates - formes de type Unix , vous pouvez combiner Start-Processavec nohup:
L'exemple suivant lance une instance PowerShell d'arrière-plan qui reste active même après la fermeture du terminal de lancement; il émet une .toutes les secondes et nohupcollecte les sorties stdout et stderr dans le fichier nohup.outdu répertoire courant, en ajoutant à un tel fichier s'il existe déjà:

# Runs for 2 minutes and appends both stdout and stderr output to ./nohup.out
Start-Process nohup 'pwsh -nop -c "1..120 | % { write-host . -nonewline; sleep 1 }"'

Sous Windows , où Start-Processpar défaut crée un processus indépendant dans une nouvelle fenêtre de console, vous pouvez utiliser -WindowStyle Hiddenpour lancer ce processus dans une fenêtre cachée qui restera active indépendamment du shell de lancement.

# Runs for 2 minutes and appends success output to ./nohup.out
Start-Process -WindowStyle Hidden pwsh '-nop -c "1..120 | % { Add-Content -nonewline nohup.out -Value .; sleep 1 }"'