Ini harus berlaku untuk semua shell dengan kontrol pekerjaan, yang (sebagian besar) dapat Anda terima begitu saja kecuali berurusan dengan shell yang benar-benar kuno. Ada dalam standar POSIX , jadi bahkan dash
mendukung kontrol pekerjaan (saat dijalankan secara interaktif atau dengan -m
).
Interaktif
- Ctrl+ zakan menangguhkan program yang saat ini foregrounded
bg
akan latar belakang program yang terakhir ditangguhkan
(digunakan bg %2
dengan nomor pekerjaan, yang dapat Anda periksa jobs
)
fg
akan memagari program yang terakhir ditangguhkan
Di zsh
, Anda bisa menulis kunci yang mengikat untuk dijalankan secara implisit fg
dari prompt melalui Ctrl+ lainnya z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Mungkin juga ada cara cerdas untuk secara implisit dijalankan bg
pada penangguhan, tetapi tampaknya tidak bijaksana; setidaknya bagi saya, sebagian besar penggunaan Ctrl+ saya zadalah karena Ctrl+ cgagal keluar; Saya ingin mengikutinya dengan misalnya kill %1
daripada bg
, dan saya tentu saja tidak ingin default untuk membunuh! (Logika ini juga meluas ke mengapa saya tidak lagi menggunakan pengikatan kunci ini: Jika saya memalu Ctrl+ zuntuk menghentikan proses, hal terakhir yang saya inginkan adalah melanjutkan!)
Non-interaktif
Jika Anda menggunakan instance shell yang berbeda (atau pengguna yang berbeda, terkadang termasuk sudo
perintah), Anda kemungkinan tidak akan dapat menggunakan nomor pekerjaan.
Anda masih dapat bertindak pada proses lain setelah Anda mengetahui ID prosesnya (PID). Anda bisa mendapatkan PID dengan pgrep …
, atau ps aux |grep …
(atau dari shell yang sama jobs -l
,, atau $!
) dan kemudian Anda dapat menjalankan:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Jika Anda tidak tahu ID proses dan tidak khawatir tentang menangguhkan instance proses lainnya dengan nama, Anda dapat mengirimkan sinyal ke salah satu dari ini:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
Sebuah CONT
sinyal untuk program berhenti dengan Ctrl+ z(dan tidak bg
'd) akan melanjutkan kemajuannya (di latar depan), sama seperti jika Anda adalah untuk fg
itu.
Re: Standard Error
Hasil edit untuk pertanyaan ini menanyakan tentang kesalahan standar:
Proses menghasilkan ke stderr, jadi bagaimana saya akan mengeluarkan perintah fg <jobid>
saat proses menghasilkan ke terminal?
Kecuali jika pekerjaan tersebut memiliki komponen yang berlatar belakang (atau seluruh pekerjaan dilatar belakangi, mungkin melalui kill -CONT
), Anda seharusnya tidak benar-benar melihat output saat ditangguhkan.
Jika masih mengeluarkan data (baik itu ke keluaran standar atau kesalahan standar), tentu saja akan membuat terminal Anda berantakan secara visual, tetapi semua output itu akan diabaikan karena itu bukan bagian dari input Anda. Ini mungkin membuatnya lebih sulit untuk mengetahui Anda belum memasukkan salah ketik apa pun, tetapi pengetikan (secara membabi buta) fg
Entersudah mencukupi (kecuali Anda memiliki banyak pekerjaan dan pekerjaan yang dimaksud bukan yang paling baru, dalam hal ini Anda memang membutuhkan deskriptor pekerjaan) ).
Jika Anda perlu menemukan deskriptor pekerjaan, gunakan terminal lain untuk mengirimkan STOP
sinyal melalui metode non-interaktif di atas. Ini akan membebaskan layar Anda (mungkin menekan Enterbeberapa kali atau menjalankan clear
atau Ctrl+ L) sehingga Anda kemudian dapat menjalankan jobs
untuk menemukan deskriptor pekerjaan dan kemudian jalankan di fg %N
mana N
nomor itu.