Tempatkan pekerjaan di latar belakang tanpa membeku

9

Katakanlah Anda memulai pekerjaan seperti ini

foo

dan kemudian ingin agar Anda menempatkannya di latar belakang. Mengetik Ctrl+ Zlalu bgmelakukan trik tetapi akan membeku fooantara Ctrl+ Zdan bg. Bagaimana saya bisa menempatkan foo di latar belakang tanpa membekukannya terlebih dahulu?

pengguna877329
sumber
7
Apa gunanya? Mengapa masalah yang prosesnya membeku untuk waktu yang singkat?
l0b0

Jawaban:

4

Secara teknis foosudah berjalan di latar belakang. Anda dapat memulai sesi terminal kedua, dan yang pertama akan terus berjalan foosaat Anda melakukan hal-hal lain.

Dalam X, ini hanya melibatkan memulai aplikasi terminal kedua, atau membuka tab lain jika emulator terminal pilihan Anda memiliki fitur seperti itu.

Pada konsol, jika Anda tidak berencana untuk itu, Anda harus beralih ke terminal virtual yang berbeda dan masuk lagi.

Jika Anda menggunakan terminal multiplexer suka screenatau tmuxAnda dapat memulai sesi lain di dalamnya. Misalnya, di layar, ini dilakukan menggunakan Ctrl+ Asegera diikuti oleh Ctrl+ C. Untuk beralih di antara mereka, gunakan Ca Cn dan Ca Cp untuk bolak-balik di antara sesi terminal.

sebuah CVn
sumber
Artinya, tidak mungkin di bash.
user877329
1
Jawaban ini tampaknya didasarkan pada kesalahpahaman konsep pekerjaan latar belakang. Terminal memiliki atribut "foreground process group", biasanya ditetapkan oleh shell, yang membuat proses dalam kelompok itu dapat membaca dari terminal dan menerima sinyal terkait tty seperti SIGINT. Semua proses yang berjalan pada terminal yang tidak ada dalam grup proses latar depan adalah proses latar belakang. Saat Anda membuat terminal baru, pekerjaan latar depan dari terminal asli masih merupakan pekerjaan latar depan di terminal itu, bahkan jika Anda tidak melihatnya.
@ WumpusQ.Wumbley Inti dari jawaban saya adalah bahwa sebagian besar (semua?) Sistem yang dapat menjalankan bash bersifat multi-tasking berdasarkan sifatnya. Pada sistem seperti itu, bahkan jika suatu proses memiliki, katakanlah, fokus input, tidak ada yang secara inheren "foreground" tentang proses itu sendiri; foo sendiri (tidak ada pemeriksaan khusus, yang saya kira di alam liar adalah suatu tempat antara langka dan tidak ada) tidak peduli apakah itu berjalan di jendela paling atas atau bahkan jika ada sesuatu yang menampilkan outputnya.
CVn
1
maksud saya adalah ketika pertanyaan secara spesifik menyebutkan kata-kata "latar belakang" dan "pekerjaan" - keduanya merupakan istilah teknis dengan makna yang didefinisikan oleh kerangka kerja grup proses POSIX - serta mekanisme Ctrl-Z dan bg, keduanya beroperasi pada grup proses - dan jawaban Anda menyarankan untuk tidak menggunakan fungsionalitas grup proses sama sekali, dan Anda menggunakan kata "latar belakang" dengan cara yang tidak sesuai dengan definisi sebenarnya - Anda tidak mencocokkan jawaban Anda dengan pertanyaan. Dan untuk memulai dengan "Secara teknis foosudah berjalan di latar belakang" ... hanya ... Tidak. Secara teknis.
@ WumpusQ.Wumbley Entah bagaimana saya tidak berpikir OP membaca standar POSIX dan berpikir "hmm, saya ingin menggunakan ini, tapi saya sudah mulai foojadi sekarang apa yang harus saya lakukan?". Jika Anda merasa jawaban ini (atau jawaban lain) tidak berguna dalam menjawab pertanyaan, saya akan mendorong Anda untuk menggunakan hak suara Anda serta meninggalkan jawaban Anda sendiri menjawab pertanyaan dari apa yang Anda rasa adalah sudut yang benar, daripada berdebat tentang salah satu jawaban yang tersisa pada pertanyaan. Mungkin Anda merasa misalnya jawaban l0b0 lebih baik, tetapi jawaban saya menawarkan cara untuk melakukan setidaknya kira-kira apa yang diinginkan OP.
CVn
3

Menambahkan &tanda setelah perintah ( foo &) akan langsung melatar belakanginya Tapi saya percaya tidak ada cara, dalam konfigurasi terminal / shell standar , untuk latar belakang sesuatu segera setelah itu foregrounded.

l0b0
sumber
3

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 foreground. Shell tidak dapat melakukannya sendiri, karena terminal harus memproses penekanan tombol (shell tidak berada di latar depan, sehingga tidak dapat menerima penekanan tombol).

Saya memiliki konfigurasi zsh di mana saya dapat menekan Ctrl+ Zdua kali berturut-turut dengan cepat; pers pertama menunda prosesnya, dan pers kedua melanjutkannya di latar belakang. Saya tidak tahu cara port ke bash.

Jika Anda menjalankan emulator terminal yang memungkinkan Anda menyuntikkan penekanan tombol, Anda bisa menyuntikkan ^Zbg^M(menggunakan ^notasi untuk karakter kontrol). Misalnya, dengan emulator terminal X11, jalankan di xdotool --window 1234 Ctrl_L+Z b g Returnmana 1234 adalah ID jendela emulator terminal. Dengan Layar, jalankan di screen -S foo -p 12 -X stuff $'\032bg\r'mana foonama sesi layar dan 12merupakan ID jendela.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Jika pengetikan Anda tidak cukup cepat untuk kasing kemudian jalankan kill -s SIGSTOP 1023 && kill -s SIGCONT 1023dari shell lain, anggap 1023 sebagai PID target.

PENOLAKAN: Seperti yang mungkin diketahui oleh Ruslan , urutan itu sebenarnya memulai kembali pekerjaan itu begitu cepat sehingga bashtidak menyadarinya.

41754
sumber
Bagaimana cara menempatkan pekerjaan ke latar belakang?
Ruslan
Seberapa cepat cepat?
user877329