Qual è l'equivalente di "nohup" in Linux PowerShell?
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
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 }"'