Bagaimana Anda mengirim aplikasi baris perintah langsung ke latar belakang?

22

Saya sudah tahu bahwa menekan ctrl+zberhenti aplikasi, maka saya dapat mengirim aplikasi ke latar belakang dengan bgperintah, tetapi itu berarti ada beberapa waktu singkat bahwa aplikasi dihentikan.

Bagaimana cara mengirim aplikasi langsung ke latar belakang tanpa menghentikannya?

trusktr
sumber
Cukup yakin Anda tidak bisa, jika sudah berjalan.
Kevin
1
Jika tugas Anda memerlukan input "sebelum menghilang" ke latar belakang, Anda dapat menggunakan alat seperti zenity atau yad (jika Anda suka guis). Mereka masih dapat mengirim dan menerima output dari latar belakang. Saya yakin bermain dengan pipa dan perangkat juga akan memberi Anda akses ke konsol dari latar belakang, tetapi saya tidak yakin bagaimana cara melakukannya.
Joe
@Joe Itu keren, tapi tidak sama sekali apa yang saya maksud. Saya hanya ingin mengirim aplikasi langsung ke latar belakang tanpa berhenti sebentar. yaitu tanpa menekan ctrl+zdiikuti dengan menjalankan perintah bg. Apakah ada kombo keystroke tunggal untuk mengirim aplikasi ke latar belakang?
trusktr

Jawaban:

17

Mengirim aplikasi dari latar depan ke latar belakang membutuhkan kerja sama dari terminal dan shell. Terminal tidak dapat melakukannya sendiri, karena shell harus mengatur grup proses latar depan. Shell tidak dapat melakukannya sendiri, karena terminal harus memproses penekanan tombol (shell tidak berada di latar depan, sehingga tidak dapat menerima penekanan tombol).

Perkiraan yang dekat adalah mengirim aplikasi ke latar belakang dengan sangat cepat. Bagaimanapun, aplikasi berbagi waktu CPU dengan yang lain dan jeda beberapa ratus detik tidak menjadi masalah. (Ini berlaku untuk aplikasi waktu-nyata, jadi pastikan untuk memulai yang di latar belakang.) Saya menggunakan shell binding untuk Ctrl+ Zyang mengirimkan pekerjaan foregrounded terakhir ke latar belakang. Dengan begitu, menekan Ctrl+ Z Ctrl+ Zmengirim pekerjaan ke latar belakang dengan waktu suspensi minimal.

Inilah zsh mengikat saya, yang juga "latar belakang" perintah setengah diketik ketika baris perintah tidak kosong .

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

Dalam bahasa Inggris, untuk pengguna non-zsh di audiensi:

  • Tentukan fungsi shell yang melakukan hal berikut:

    • Jika panjang buffer input adalah 0, maka letakkan pekerjaan saat ini (pekerjaan yang terakhir ditangguhkan atau dimulai) di latar belakang , dan tampilkan kembali prompt.
    • Jika tidak, dorong buffer input ke tumpukan dan tampilkan prompt baru. Setelah pengguna memasukkan perintah atau membatalkannya dengan Ctrl+ C, buffer yang didorong akan dikembalikan untuk edisi selanjutnya.
  • Bind fungsi ini ke Ctrl+ Z.

Jika Anda hanya ingin perilaku latar belakang terlepas dari apakah baris perintah kosong:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

Saya tidak tahu apakah Anda dapat melakukan hal yang sama di bash. Seharusnya semudah bind -x '"\C-z": bg', kecuali bahwa bash meninggalkan karakter tty stop di tempatnya, sehingga Ctrl+ tidak pernah mendapat + Zsebagai input.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Menarik, biarkan saya melihat apakah ini bisa dilakukan di Bash. Jika demikian, ini akan menjadi solusi. Saya tidak terbiasa dengan zsh. Pikiran menjelaskan apa yang skrip Anda lakukan?
trusktr
@trusktr Lihat hasil edit saya.
Gilles 'SO- stop being evil'
Terima kasih! Saya akan beralih ke zsh. Saya sudah mendengar banyak hal baik tentang itu.
trusktr
15

Anda bisa latar belakang tugas dengan menambahkan &setelahnya.

Misalnya tail -f /var/log/messages &akan segera latar belakang tugas.

Seperti biasa Anda dapat melihat tugas apa yang Anda latar belakang dengan jobsperintah.

Ini tentu saja mengasumsikan Anda belum menjalankan perintah.

prateek61
sumber
Itu berguna, tetapi bukan itu yang saya maksud. Jika saya memiliki aplikasi di latar depan, maka ingin mengirimnya ke latar belakang nanti, saya dapat menekan ctrl+zkemudian jalankan bgdi baris perintah untuk aplikasi berjalan di latar belakang. Tetapi antara menekan ctrl+zdan mengeksekusi bg, ada jangka waktu bahwa aplikasi sepenuhnya dijeda. Saya tidak menginginkan itu. Bagaimana saya mengirimnya ke latar belakang segera ?
trusktr
@ trusktr seperti yang dikatakan Gilles. Anda perlu memberi tahu shell dan terminal. Maaf, saya tidak tahu cara untuk melakukan itu.
prateek61
Itu tidak menjawab pertanyaan.
Luciano Andress Martini
4

Latar belakang suatu perintah dilakukan dengan menambahkan ampersand ke perintah tersebut.

sleep 300 &

Jika sudah berjalan, satu-satunya pilihan Anda adalah menghentikannya, lalu latar belakang.

bahamat
sumber
Di antara menekan ctrl + z dan mengeksekusi bg, ada kerangka waktu bahwa aplikasi benar-benar dijeda, yang tidak saya inginkan. Jadi tidak ada cara untuk mengirimnya ke latar belakang segera ?
trusktr
1
Nggak. Seperti yang dikatakan Giles, dibutuhkan shell dan terminal. Anda perlu memberi tahu masing-masing.
bahamat