GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa melakukan Ctrl-Z dan bg dalam satu penekanan tombol untuk membuat proses berlanjut di latar belakang?

Ctrl +Z urutan ditangani oleh terminal, bukan oleh shell. (Latar belakang yang berguna:Apa perbedaan sebenarnya antara 'terminal', 'shell', 'tty', dan 'console'?)

Hanya sekumpulan kecil fungsi yang tidak dapat diperluas yang dapat diikat ke kunci di terminal. Anda dapat menyesuaikan tombol yang terikat pada fungsi ini tetapi tidak dapat menambahkan fungsi lain. Fungsi ini terbagi dalam tiga kategori:

  • Edisi baris perintah dalam program yang tidak menyediakannya sendiri (mode kanonik, juga disebut mode matang (berlawanan dengan mode mentah), yang jarang Anda gunakan dalam praktik):akhir file (eof , Ctrl +D ), akhir baris (eol , Ctrl +M ), hapus karakter yang tersisa (erase , Ctrl +H ), hapus kata yang tersisa (werase , Ctrl +W ), hapus baris (kill , Ctrl +U ).
  • Kontrol aliran manual:stop (Ctrl +S ), start (Ctrl +Q ). Hanya berguna pada terminal serial lama yang menghilangkan karakter saat terminal tidak dapat mengimbangi komputer atau sebaliknya.
  • Pensinyalan:interupsi (intr , Ctrl +C ), tutup paksa (quit , Ctrl +\ ), tangguhkan (Ctrl +Z ).

Beberapa sistem, termasuk Linux, memperluas daftar itu, tetapi saya belum pernah melihat yang menyertakan latar belakang. Perhatikan bahwa ini akan membutuhkan dukungan baik di driver terminal di kernel, dan di emulator terminal. Jadi, Anda harus puas dengan penangguhan, yang mengirimkan sinyal SIGTSTP pekerjaan latar depan. Ini memicu SIGCHLD dalam proses induk pemimpin tugas latar depan, yang biasanya adalah shell. Saat shell menerima SIGCHLD, shell memanggil waitpid untuk mencari tahu mengapa itu diberitahukan, dan setelah terdeteksi bahwa pekerjaan latar belakang ditangguhkan, itu akan menampilkan pemberitahuan (mis. [1] + 12345 suspended mycommand ) dan perintah baru.

Anda dapat memprogram shell untuk mengirim SIGCONT sinyal ke pekerjaan latar depan. Saya tidak berpikir zsh memiliki pengait untuk itu, Anda perlu menambal kode sumbernya. Dan tidak ada cara bagi zsh untuk mengetahui apakah Anda benar-benar bermaksud menghentikan program (oops, program ini mungkin melakukan hal yang salah, izinkan saya menangguhkannya sementara saya menyelesaikannya) atau ke latar belakangnya.

Apa yang saya lakukan adalah mengatur Ctrl +Z urutan kunci di zsh untuk melatarbelakangi pekerjaan saat ini (%% ). Dengan begitu, saya dapat mengirimkan tugas latar depan ke latar belakang dengan menekan Ctrl +Z Ctrl +Z . Sementara saya melakukannya, saya membuat Ctrl +Z lakukan hal lain yang berguna ketika baris input saat ini tidak kosong (jadi saya belum kembali dari subproses):"tangguhkan" baris input saat ini, izinkan saya untuk mengetik perintah lain, setelah itu baris yang terputus didorong kembali ke buffer masukan.

fancy-ctrl-z () {
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

^z ^z seperti zsh di atas dimungkinkan dalam bash, meskipun agak kotor dan saya sudah lama tidak menjalankan ini:

  • Dalam .inputrc Anda sertakan pemetaan "\C-z": "bg\n"
  • Dalam variabel bash PS0 sertakan `$(stty susp ^z)'
  • Dalam variabel bash PROMPT_COMMAND sertakan 'stty susp ^@'

jadi ^z untuk penangguhan diaktifkan saat perintah dijalankan, lalu dimatikan untuk prompt bash.


Linux
  1. Bagaimana menjalankan proses Rsync di latar belakang

  2. Bagaimana menjalankan Node.js sebagai proses latar belakang dan tidak pernah mati?

  3. Proses latar belakang di linux

  1. bagaimana saya bisa mencari file dan meng-zip-nya dalam satu file zip

  2. Bagaimana saya bisa menghapus kata sandi dan mengunci akun dalam satu langkah?

  3. Bisakah saya membatasi pengguna (dan aplikasinya) ke satu antarmuka jaringan?

  1. Bagaimana Menangguhkan Dan Membawa Proses Latar Belakang Ke Latar Depan?

  2. Bagaimana proses mencegat stdout dan stderr dari proses lain di Linux?

  3. Bagaimana cara mendapatkan ID proses dari proses latar belakang?