Linux PowerShell'deki 'nohup'ın eşdeğeri nedir?

Nov 06 2020

Yinelenen sorunun varlığını çok iyi biliyorum . Ancak bu soru yanıtlandı olarak işaretlenmiş ve orijinal soruyu yanıtladığını hiç sanmıyorum.

$ nohup commandTutar yürütme komutu bile nohup kalıpların ana süreç (kabuk). Daha fazla bilgi burada: nohup ve ve işareti arasındaki fark nedir .

Win32 api durumunda , sistem bir işlemi sonlandırırken, sürecin oluşturduğu herhangi bir alt işlemi sonlandırmıyor satırını görüyorum . Bir sürecin sonlandırılması, WH_CBT kanca prosedürleri için bildirim oluşturmaz. . Bu, sorduğum istenen davranış. Bu, win32 powershell ile otomatik olarak çalışır. Ancak linux powershell'lerde Start-Job, powershell öldürüldüğünde öldürülmesi anlamında powershell bağlamında sadece arka plan işidir.

Misal:

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

Yanıtlar

2 mklement0 Nov 06 2020 at 09:23

Start-JobPowerShell v6 + 'nın &arka plan işlecini kullanmak veya kullanmak bir seçenek değildir, çünkü işin sonlandırılması, ondan başlatılan ve hem Windows hem de Unix benzeri platformlarda olan alt işlemleri de sonlandırır .

Bununla birlikte, cmdlet nohuparacılığıyla benzer davranışlar elde edebilirsiniz Start-Process:

On Unix benzeri platformlar , sen birleştirebilirsiniz Start-Processile nohup:
Aşağıdaki örnek lansmanları kalır hayatta terminali başlatılması size kapattıktan sonra bile bir arka plan PowerShell örneği; .her saniyede bir yayar ve nohuphem stdout hem de stderr çıktısını nohup.outgeçerli dizindeki dosyada toplar , zaten varsa böyle bir dosyaya ekler:

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

On Windows'un , Start-Processvarsayılan olarak yeni bir konsol penceresinde bağımsız sürecini oluşturur kullanabilirsiniz -WindowStyle Hiddenhayatta bağımsız fırlatma kabuğun kalacaktır gizli pencerede bu süreci başlatmak için.

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