Что эквивалентно nohup в Linux PowerShell?

Nov 06 2020

Я очень хорошо знаю, что существует повторяющийся вопрос . Но этот вопрос отмечен как ответ, и я не думаю, что он вообще отвечает на исходный вопрос.

Команда $ nohup commandпродолжает выполнять команду, даже если родительский процесс (оболочка) nohup умирает. Подробнее здесь: В чем разница между nohup и амперсандом .

В случае Win32 api я вижу строку. Когда система завершает процесс, она не завершает никаких дочерних процессов, созданных этим процессом. Завершение процесса не генерирует уведомления для подключаемых процедур WH_CBT. . Это желаемое поведение, о котором я спрашиваю. Это работает с win32 powershell автоматически. Но с Linux PowerShell Start-Jobэто просто фоновая работа в контексте PowerShell в том смысле, что она прекращается, когда прекращается работа PowerShell.

Пример:

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

Ответы

2 mklement0 Nov 06 2020 at 09:23

Использование фонового оператораStart-Job PowerShell v6 + или не вариант, потому что завершение задания также приведет к прекращению дочерних процессов, запущенных из него, а это задания - как на Windows, так и на Unix-подобных платформах .&

Однако вы можете добиться nohupподобного поведения с помощью Start-Processкомандлета:

На Unix- подобных платформах вы можете комбинировать Start-Processс nohup:
В следующем примере запускается фоновый экземпляр PowerShell, который остается активным даже после закрытия запускающего терминала; он выдает .каждую секунду и nohupсобирает выходные данные stdout и stderr в файле nohup.outв текущем каталоге, добавляя его к такому файлу, если он уже существует:

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

В Windows , где Start-Processпо умолчанию создается независимый процесс в новом окне консоли, вы можете использовать его -WindowStyle Hiddenдля запуска этого процесса в скрытом окне, которое останется активным независимо от запускающей оболочки.

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