Jaki jest odpowiednik „nohup” w programie Linux PowerShell?

Nov 06 2020

Bardzo dobrze wiem, że pytanie zostało powtórzone . Ale to pytanie jest oznaczone jako odpowiedź i nie sądzę, że w ogóle odpowiada na pierwotne pytanie.

$ nohup commandKomenda zachowuje wykonywania nawet jeśli proces nadrzędny (shell) matryc nohup. Więcej informacji tutaj: Jaka jest różnica między nohup i ampersand .

W przypadku Win32 api, widzę wiersz Kiedy system kończy proces, nie kończy on żadnych procesów potomnych, które utworzył proces. Zakończenie procesu nie generuje powiadomień dla procedur przechwytujących WH_CBT. . To jest pożądane zachowanie, o które pytam. Działa to automatycznie z win32 powershell. Ale w przypadku Linuksa PowerShell jest Start-Jobto tylko praca w tle w kontekście PowerShell w tym sensie, że zostaje zabita, gdy PowerShell zostaje zabity.

Przykład:

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

Odpowiedzi

2 mklement0 Nov 06 2020 at 09:23

Korzystanie z operatora działającego w tleStart-Job lub PowerShell v6 + nie wchodzi w grę, ponieważ zakończenie zadania spowoduje również zakończenie uruchomionych z niego procesów potomnych, którymi są - zarówno w systemie Windows, jak i na platformach typu Unix .&

Można jednak uzyskać nohuppodobne zachowanie za pomocą polecenia Start-Processcmdlet:

Na platformach typu Unix można łączyć Start-Processz nohup:
Poniższy przykład uruchamia działającą w tle instancję PowerShell, która pozostaje aktywna nawet po zamknięciu terminala uruchamiającego; emituje .co sekundę i nohupzbiera wyjście stdout i stderr w pliku nohup.outw bieżącym katalogu, dołączając do takiego pliku, jeśli już istnieje:

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

W systemie Windows , w którym Start-Processdomyślnie tworzy niezależny proces w nowym oknie konsoli, można go użyć -WindowStyle Hiddendo uruchomienia tego procesu w ukrytym oknie, które pozostanie aktywne niezależnie od powłoki uruchamiającej.

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