Qual è l'equivalente di "nohup" in Linux PowerShell?

Nov 06 2020

Conosco molto bene l'esistenza di domande duplicate . Ma quella domanda è contrassegnata come risposta e non penso che risponda affatto alla domanda originale.

Il $ nohup commandcomando continua a eseguire il comando anche se il processo genitore (shell) di nohup muore. Maggiori informazioni qui: qual è la differenza tra nohup e e commerciale .

In caso di API Win32, viene visualizzata la riga Quando il sistema termina un processo, non termina alcun processo figlio creato dal processo. La terminazione di un processo non genera notifiche per le procedure hook WH_CBT. . Questo è il comportamento desiderato di cui sto chiedendo. Funziona automaticamente con Win32 PowerShell. Ma con Linux PowerShell Start-Jobè semplicemente un lavoro in background nel contesto PowerShell, nel senso che viene ucciso quando PowerShell viene ucciso.

Esempio:

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

Risposte

2 mklement0 Nov 06 2020 at 09:23

L'utilizzo dell'operatore in backgroundStart-Job o di PowerShell v6 + non è un'opzione, perché terminare il lavoro terminerà anche i processi figli avviati da esso, che sono i lavori, sia su Windows che su piattaforme simili a Unix .&

Tuttavia, è possibile ottenere un nohupcomportamento simile tramite il Start-Processcmdlet:

Su piattaforme simili a Unix , è possibile combinarlo Start-Processcon nohup:
L'esempio seguente avvia un'istanza di PowerShell in background che rimane attiva anche dopo la chiusura del terminale di avvio; emette un messaggio .ogni secondo e nohupraccoglie sia l'output di stdout che quello di stderr nel file nohup.outnella directory corrente, aggiungendolo a tale file se esiste già:

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

Su Windows , dove Start-Processper impostazione predefinita crea un processo indipendente in una nuova finestra della console, è possibile utilizzare -WindowStyle Hiddenper avviare quel processo in una finestra nascosta che rimarrà attiva indipendentemente dalla shell di avvio.

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