Apa contoh praktis menggunakan perintah menangguhkan di Bash?

12

suspendadalah perintah builtin di Bash. Kapan Anda secara alami menggunakan perintah ini dan menganggapnya berguna?

igor
sumber
1
Shell menangguhkan dirinya sendiri setiap kali bercabang proses anak, yaitu menjalankan perintah di mana perintah tersebut adalah program eksternal, membutuhkan fork/execpanggilan sistem
the_velour_fog
1
Dalam shell interaktif ini memungkinkan proses anak untuk mengontrol terminal, sementara shell induk tidak berinteraksi dengan terminal, yang menjadi berantakan.
the_velour_fog
2
@velour, tapi itu tidak perlu menjalankan perintah terpisah untuk efek itu?
ilkkachu
@the_velour_fog Secara teknis, shell induk tidak ditangguhkan (tidak mendapatkan STOPsinyal) ketika garpu proses anak. Saya juga agak bingung dengan komentar kedua Anda.
Kusalananda
1
@ Kusalananda ok, benar wait()kedengarannya masuk akal bagi saya. Saya mengatakan Shell menangguhkan dirinya sendiri setiap kali garpu memproses anak . Saya tidak mengatakan apa-apa tentang menerima sinyal berhenti, itu tidak masuk akal.
the_velour_fog

Jawaban:

14

Katakanlah Anda tidak memiliki GNU screendan tmux(dan X11, serta konsol virtual), tetapi ingin beralih antara shell login dan shell interaktif lainnya.

Pertama-tama Anda akan login di konsol, dan kemudian memulai shell baru, sementara memblokir shell login. Untuk mendapatkan shell login kembali untuk melakukan pekerjaan di sana, Anda harus melakukannya suspend. Maka Anda akan fgmendapatkan shell interaktif kembali untuk melanjutkan dengan apa pun yang Anda lakukan di sana.

Faktanya, dengan kontrol pekerjaan, shell login dapat menelurkan sejumlah shell interaktif sebagai pekerjaan latar belakang yang bisa Anda gunakan fg %1, fg %2dll., Tetapi untuk kembali ke shell login, Anda harus menggunakan suspendkecuali Anda ingin secara manual kill -s STOP $$.

Perhatikan juga bahwa Ctrl+ Zpada prompt di shell interaktif tidak akan menangguhkannya.

EDIT: Saya awalnya memiliki bagian hipotetis panjang tentang penggunaan suspenddalam skrip, tetapi karena perintah itu memerlukan kontrol pekerjaan dan karena shell non-interaktif biasanya tidak memiliki kontrol pekerjaan, saya menghapus bagian itu.


Bagian yang dihapus dengan suspenddiganti oleh kill -s STOP $$(ini benar-benar bukan milik jawaban lagi, tetapi mungkin menarik bagi orang lain):

Katakanlah Anda memiliki proses latar belakang (skrip) dalam skrip, dan bahwa proses latar belakang ini pada tahap tertentu perlu berhenti dan menunggu proses induk untuk menyuruhnya melanjutkan. Ini bisa jadi orang tua punya waktu untuk mengekstrak dan memindahkan file ke tempatnya atau sesuatu seperti itu.

Skrip anak akan ditangguhkan ( kill -s STOP $$), dan skrip induk akan mengirimkan CONTsinyal kepadanya ketika boleh melanjutkan.

Ini memberi Anda kesempatan untuk menerapkan semacam sinkronisasi antara proses induk dan proses anak (meskipun sangat mendasar karena proses shell induk lebih atau kurang perlu menebak bahwa proses anak ditangguhkan, meskipun ini dapat diperbaiki dengan memiliki anak perangkap CONTdan tidak menunda jika sinyal itu diterima terlalu dini).

Kusalananda
sumber