Apa yang setara dengan 'nohup' di linux PowerShell?

Nov 06 2020

Saya tahu betul adanya pertanyaan duplikat . Tetapi pertanyaan itu ditandai terjawab dan saya kira itu sama sekali tidak menjawab pertanyaan asli.

Perintah $ nohup commandtetap mengeksekusi meskipun proses induk (shell) dari nohup mati. Info selengkapnya di sini: Apa perbedaan antara nohup dan ampersand .

Dalam kasus api Win32, saya melihat baris Ketika sistem menghentikan suatu proses, itu tidak menghentikan semua proses anak yang telah dibuat oleh proses tersebut. Mengakhiri proses tidak menghasilkan pemberitahuan untuk prosedur hook WH_CBT. . Ini adalah perilaku yang diinginkan yang saya tanyakan. Ini bekerja dengan win32 PowerShell secara otomatis. Tetapi dengan linux PowerShell Start-Jobitu hanya pekerjaan latar belakang dalam konteks PowerShell dalam arti terbunuh ketika PowerShell terbunuh.

Contoh:

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

Jawaban

2 mklement0 Nov 06 2020 at 09:23

Menggunakan Start-Jobatau &operator latar belakang PowerShell v6 + bukanlah suatu pilihan, karena menghentikan pekerjaan juga akan menghentikan proses turunan yang diluncurkan darinya, yang pekerjaannya - baik pada Windows dan pada platform mirip Unix .

Namun, Anda dapat mencapai nohupperilaku seperti melalui Start-Processcmdlet:

Pada platform mirip Unix , Anda dapat menggabungkan Start-Processdengan nohup:
Contoh berikut meluncurkan instans PowerShell latar belakang yang tetap hidup bahkan setelah Anda menutup terminal peluncuran; itu memancarkan .setiap detik, dan nohupmengumpulkan output stdout dan stderr dalam file nohup.outdi direktori saat ini, menambahkan file seperti itu jika sudah ada:

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

Di Windows , di mana Start-Processsecara default membuat proses independen di jendela konsol baru, Anda dapat menggunakan -WindowStyle Hiddenuntuk meluncurkan proses itu di jendela tersembunyi yang akan tetap hidup secara independen dari shell peluncuran.

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