Manajemen proses latar belakang bash
- 4083
- 929
- Enrique Purdy
Ada berkali -kali ketika pengembang bash atau pengguna ingin menjalankan proses di latar belakang, baik dari baris perintah atau dari dalam skrip bash, dan kemudian menangani proses yang sama lagi nanti. Ada berbagai alat baris perintah yang memungkinkan seseorang melakukannya. Mampu memulai, mengelola, dan menghancurkan proses latar belakang adalah persyaratan untuk banyak tugas tingkat yang lebih lanjut, terutama di bidang skrip dan kontrol proses canggih dan kontrol.
Dalam tutorial ini Anda akan belajar:
- Cara memulai, menangani dan/atau mengelola, dan menghancurkan proses latar belakang
- Alat baris perintah apa yang tersedia untuk membantu Anda dengan manajemen proses bash
- Contoh Menyoroti Penggunaan Proses Latar Belakang di Baris Perintah Bash
Persyaratan dan konvensi perangkat lunak yang digunakan
Kategori | Persyaratan, konvensi atau versi perangkat lunak yang digunakan |
---|---|
Sistem | Distribusi Linux-independen |
Perangkat lunak | Baris perintah bash, sistem berbasis Linux |
Lainnya | Utilitas apa pun yang tidak termasuk dalam shell bash secara default dapat diinstal menggunakan sudo apt-get install-name utilitas (atau instalasi yum untuk sistem berbasis redhat) |
Konvensi | # - mengharuskan Linux -Commands untuk dieksekusi dengan hak istimewa root baik secara langsung sebagai pengguna root atau dengan menggunakan sudo memerintah$-mengharuskan Linux-Commands untuk dieksekusi sebagai pengguna biasa |
Contoh 1: Memulai proses di latar belakang dan membawanya kembali ke latar depan
$ sleep 1000 & [1] 25867 $ fg tidur 1000
Di sini kami memulai proses tidur 1000 detik di latar belakang. Jika kami ingin menempatkan proses di latar belakang, kami dapat menggunakan ampersand (&
) menandatangani di belakang perintah apa pun. Ini akan menempatkan proses di latar belakang, dan melaporkan kembali Pid
(ID proses, nomor pengidentifikasi yang mengidentifikasi proses apa pun yang berjalan pada mesin Linux). Dalam contoh ini, Pid
adalah 25867
. Perhatikan bahwa prosesnya terus berjalan ketika ditempatkan di latar belakang, yang memberi kita yang terbaik dari kedua dunia; Prosesnya sedang dijalankan, dan kami mendapatkan baris perintah kami kembali sementara itu! Besar.
Kami selanjutnya menempatkan proses kembali di latar depan (seolah -olah tidak pernah ada instruksi latar belakang) dengan menggunakan FG
(Saya.e. perintah latar depan). Hasilnya adalah kita melihat proses apa yang ditempatkan di latar depan lagi (i.e. Tidur 1000
) dan prompt perintah kami tidak kembali saat kami menempatkan tidur kembali di latar depan dan prompt perintah hanya akan kembali ketika tidur 1000 detik selesai.
Katakanlah kami menempatkan Tidur 1000
Di latar belakang, melakukan pekerjaan lain selama 500 detik, dan kemudian dieksekusi FG
… Berapa lama tidur masih berjalan? Jika Anda menebak (atau tahu) 500 detik, maka Anda benar. 500 detik pertama dihabiskan untuk berjalan sebagai proses latar belakang, dan 500 kedua adalah sebagai proses latar depan.
Perhatikan juga bahwa jika Anda mengakhiri shell, perintah Anda akan berakhir - apakah itu berjalan di latar belakang, atau di latar depan (kecuali jika Anda tidak mengakui hal ini, lebih lanjut tentang ini dalam contoh berikutnya).
Contoh 2: Menyangkal suatu proses
$ sleep 1000 & [1] 26090 $ Disown %1 $
Di sini kami memulai tidur 1000 detik lagi, dan kami diberitahu tentang PID dari proses latar belakang seperti sebelumnya. Selanjutnya kami mengeksekusi Disownel %1
, mengacu pada proses latar belakang pertama (seperti juga ditunjukkan oleh [1]
sebelum pid!), dan menginstruksikan Bash untuk Diserahkan (Disassociate) Proses ini dari shell saat ini. Bukannya itu akan terlepas dari pengguna saat ini (dan misalnya ps -ef | Grep Sleep | grep -v grep
akan memang masih menunjukkan userid Anda), melainkan dari sesi shell saat ini. Lihat:
$ sleep 1000 & [1] 26214 $ Disown %1 $ ps -ef | Grep Sleep | grep -v grep roel 26214 26120 0 13:13 poin/3 00:00:00 Tidur 1000 $ EXIT
Kemudian, membuka cangkang baru dan mengeksekusi ulang ps
kita dapat melihat bahwa perintah itu masih ada dan sekarang melekat pada ppid (pid induk) 1
alih-alih 26120
sebagai PED PID:
$ ps -ef | Grep Sleep | grep -v grep roel 26214 1 0 19:48 ? 00:00:00 Tidur 1000
Seolah -olah shell masih berjalan (perhatikan 26214
PID masih aktif/dikaitkan dengan berjalan tidur
), Namun bagian baris perintah aktif itu hilang!
Hebat, jadi ini memberi kita cara untuk memisahkan proses dari cangkang saat ini, dan dengan demikian memastikan mereka terus berjalan saat sesi shell kita ditutup.
Contoh 3: Menempatkan perintah ke latar belakang
$ tidur 1000 ^z [1]+ berhenti tidur 1000 $ bg %1 [1]+ tidur 1000 & $
Di sini kami memulai a Tidur 1000
di latar depan (tidak &
digunakan), dan interupsi proses itu dengan pintasan keyboard Ctrl+z
. Perhatikan bahwa saat output mengatakan ^Z
(Dan ^
adalah simbol untuk menunjukkan Ctrl
), the Z
sebenarnya adalah huruf kecil z
, Jadi Anda tidak perlu menggunakan MENGGESER
, hanya Ctrl+z
.
Perhatikan bahwa prosesnya benar -benar berhenti, itu tidak terus berlari. Sekarang kami telah menempatkan proses di latar belakang, dan berhenti. Agar proses ini terus berjalan sekarang, kami memiliki dua opsi; FG %1
- Saya.e. Tempatkan proses yang ditunjukkan oleh [1]
kembali ke latar depan dan terus berlari secara normal, atau BG %1
yang akan melanjutkan prosesnya, tetapi di latar belakang. Dalam contoh kita dapat melihat yang terakhir, dan prompt perintah kita kembali seperti yang diharapkan.
Perhatikan bahwa di atas dapat sedikit ditambah menyangkal
, mencocokkan cara yang sering digunakan untuk menangani proses saat menggunakan server jarak jauh. Katakanlah Anda terhubung melalui SSH ke server jarak jauh dan memulai pekerjaan besar, misalnya cadangan atau pembuatan laporan. Sekarang Anda ingin meninggalkan kantor Anda untuk hari itu, tetapi tidak yakin apakah koneksi SSH Anda akan tetap hidup sepanjang malam, dan bahkan apakah komputer Anda tidak akan hibernasi atau serupa. Tindakan ini dapat membahayakan pekerjaan yang sedang berjalan!
Dalam hal ini, Anda dapat melakukan hal berikut;
$ tidur 1000 ^z [1]+ berhenti tidur 1000 $ bg %1 [1]+ tidur 1000 & $ disownel %1 $ $
Dan dengan senang hati dan aman berjalan menjauh dari komputer Anda (setelah menguncinya;), karena Anda dapat yakin bahwa - bahkan jika koneksi SSH Anda gagal, atau komputer Anda hibernasi, atau wanita pembersih mengetuk kabel listrik - bahwa pekerjaan Anda akan tetap ada berlari. Karena prosesnya dibatalkan/dilepas dari sesi shell saat ini, ia akan terus berjalan bahkan jika sesi shell saat ini entah bagaimana diakhiri.
Satu peringatan kecil adalah bahwa Anda tidak dapat menggunakannya FG
Di pagi hari untuk membawa pekerjaan kembali ke latar depan, bahkan jika koneksi SSH dan shell Anda tidak pernah dihentikan/gagal:
$ FG Bash: FG: Saat Ini: Tidak ada pekerjaan seperti itu $ FG %1 Bash: FG: %1: Tidak ada pekerjaan seperti itu
Saat dibatalkan, itu terlepas dan hilang! Pekerjaan itu masih akan berjalan di latar belakang, dan Anda bahkan dapat membunuhnya menggunakannya PID (seperti yang dapat diamati ps -ef | grep your_process_name | grep -v grep
.
Contoh 4: beberapa proses latar belakang dan proses penghentian
Pertama kami memulai dua proses di latar belakang menggunakan tepercaya kami Tidur 1000
contoh:
$ tidur 1000 & [1] 27158 $ tidur 1000 & [2] 27159
Di sini kita dapat melihat di sini bahwa dua proses latar belakang ([1]
Dan [2]
, dengan PID 27158
Dan 27159
masing -masing) dimulai. Selanjutnya, kami membunuh proses pertama:
$ kill %1 $ [1]- Diakhiri tidur 1000 $
Itu mudah/mudah, benar? Satu pertanyaan yang mungkin diajukan adalah mengapa informasi yang dihentikan tidak segera ditampilkan (diperlukan pers tambahan diperlukan seperti yang Anda lihat) dan alasannya adalah bahwa prosesnya tidak diakhiri sebelum baris perintah dikembalikan. Sebagai bagian dari pekerjaan yang dilakukan setiap kali sebelum baris perintah baru ditampilkan adalah melaporkan sejumlah status, termasuk status proses latar belakang jika diperlukan. Jadi, ketika masuk ditekan lagi (ditunjukkan oleh kosong $
baris, laporan proses yang dihentikan ditampilkan.
Contoh 5: satu dilakukan sebelum yang lain
Mari kita mulai dua proses, tetapi kali ini proses kedua hanya akan tidur selama 3 detik:
$ tidur 1000 & [1] 27406 $ tidur 3 & [2] 27407 $
Setelah sekitar 5 detik, menekan enter, kita akan melihat:
$ [2]+ selesai tidur 3
Apa yang akan terjadi sekarang jika kita menggunakan FG
dalam hal ini tanpa aslinya [1]
specifier?
$ fg tidur 1000 ^z [1]+ berhenti tidur 1000 $
Proses pertama akan berlanjut! Ini juga terjadi jika prosedur sebaliknya digunakan:
$ sleep 10 & [1] 27346 $ tidur 1000 & [2] 27347 $ [1]- selesai tidur 10 $ fg tidur 1000 ^z [2]+ berhenti tidur 1000
Itu FG
Perintah akan selalu mengambil perintah terakhir yang ditempatkan ke latar belakang (dan yang belum selesai), dan letakkan di latar depan lagi.
Kesimpulan
Dalam artikel ini, kami melihat berbagai perintah, termasuk bg
, FG
dan latar belakang bash ungkapan ampersand &
yang dapat ditempatkan setelah perintah apa pun untuk menempatkan perintah itu ke latar belakang. Kami juga menjelajahi pengguna membunuh
perintah dan melihat cara mengatasi berbagai proses latar belakang menggunakan %
Bash Idiom dengan nomor proses latar belakang yang cocok seperti %1
untuk [1]
dll.
Jika Anda ingin mempelajari lebih lanjut tentang Bash secara umum, lihat seri dan trik Contoh Contoh Baris Bash Contoh Tips dan Trik.
Nikmati keterampilan bash baru Anda yang ditemukan, dan jika Anda melakukan sesuatu yang keren dengan proses latar belakang, silakan tinggalkan komentar di bawah ini!
Tutorial Linux Terkait:
- Pengantar Otomatisasi Linux, Alat dan Teknik
- Menguasai loop skrip bash
- Loop bersarang dalam skrip bash
- Hal -hal yang harus diinstal pada ubuntu 20.04
- Multi-threaded Bash Scripting & Manajemen Proses di…
- Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
- Menangani input pengguna dalam skrip bash
- Sistem Linux Hung? Cara melarikan diri ke baris perintah dan…
- Tutorial debugging GDB untuk pemula
- Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux