Was entspricht 'nohup' in Linux PowerShell?

Nov 06 2020

Ich kenne die Existenz einer doppelten Frage sehr gut . Aber diese Frage ist als beantwortet markiert und ich glaube nicht, dass sie die ursprüngliche Frage beantwortet.

Der $ nohup commandBefehl wird weiterhin ausgeführt, auch wenn der übergeordnete Prozess (Shell) von nohup stirbt. Mehr Infos hier: Was ist der Unterschied zwischen nohup ist und Ampersand .

Im Fall der Win32-API wird die Zeile angezeigt. Wenn das System einen Prozess beendet, werden keine untergeordneten Prozesse beendet, die der Prozess erstellt hat. Das Beenden eines Prozesses generiert keine Benachrichtigungen für WH_CBT-Hook-Prozeduren. . Dies ist das gewünschte Verhalten, nach dem ich frage. Dies funktioniert automatisch mit win32 Powershell. Aber mit Linux Powershell ist Start-Jobes nur ein Hintergrundjob im Powershell-Kontext in dem Sinne, dass es getötet wird, wenn Powershell getötet wird.

Beispiel:

➜  ~ 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

Antworten

2 mklement0 Nov 06 2020 at 09:23

Die Verwendung des Hintergrundoperators vonStart-Job oder PowerShell v6 + ist keine Option, da durch das Beenden des Jobs auch untergeordnete Prozesse beendet werden, die von dort gestartet werden. Dies sind Jobs - sowohl auf Windows- als auch auf Unix-ähnlichen Plattformen .&

nohupÜber das Start-ProcessCmdlet können Sie jedoch ein ähnliches Verhalten erzielen:

Auf Unix - ähnlichen Plattformen können Sie kombinieren Start-Processmit nohup:
Im folgende Beispiel startet einen Hintergrund Powershell - Instanz, die am Leben bleibt , auch nachdem Sie die Start - Terminal zu schließen; Es gibt .jede Sekunde eine nohupAusgabe aus und sammelt sowohl die stdout- als auch die stderr-Ausgabe in einer Datei nohup.outim aktuellen Verzeichnis, wobei eine solche Datei angehängt wird, falls sie bereits vorhanden ist:

# 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 }"'

Unter Windows , wo Start-Processstandardmäßig ein unabhängiger Prozess in einem neuen Konsolenfenster erstellt wird, können Sie -WindowStyle Hiddendiesen Prozess in einem ausgeblendeten Fenster starten, das unabhängig von der Startshell aktiv bleibt.

# 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 }"'