izabera/psadalah implementasi Bash untuk meniru keluaran yang mirip denganps auxdi dalam Bash, bahkan dalam situasi ketika proses baru tidak dapat dibuat- Kondisi utamanya adalah ketika pada mesin yang diakses lewat
sshada bash shell tepercaya, tetapi semua PID lain sedang terpakai sehingga proses baru tidak bisa dibuat - README menyajikan situasi ini sebagai contoh pertanyaan wawancara untuk posisi yang membutuhkan pengetahuan Bash/Linux
- Alat ini digambarkan memungkinkan Anda “berpura-pura seolah punya akses ke
ps auxyang berfungsi”, dan tidak menjamin sebagai implementasi pengganti yang lengkap - Pernyataan “berfungsi 100% di semua mesin dan semua situasi” jelas digunakan sebagai jaminan bernada lelucon
Proyek ini melakukan apa
- Ini adalah proyek yang menulis
ps auxhanya dengan Bash - Judul README adalah “
ps auxwritten entirely in bash without ever forking” - Ciri utama proyek ini adalah sama sekali tidak melakukan fork saat berjalan
Situasi yang diasumsikan
- Contoh situasinya adalah sebagai berikut
- Terhubung ke mesin lewat
ssh - Pengguna berada di dalam bash shell yang familier
- Namun semua PID lain sedang terpakai sehingga tidak ada proses baru yang bisa dibuat sama sekali
- Terhubung ke mesin lewat
- README memperkenalkan bahwa dalam kondisi seperti ini, fungsi yang mirip
ps auxbisa saja diperlukan
Cakupan yang bisa diharapkan dan caveat
- Alat ini diperkenalkan untuk memungkinkan pengguna “kinda sorta pretend” seolah memiliki
ps auxyang berfungsi - Frasa README “berfungsi sempurna dalam semua situasi di 100% mesin, dijamin” digunakan sebagai humor yang dilebih-lebihkan
- Karena itu, inti penjelasannya bukan kompatibilitas penuh, melainkan meniru
ps auxhanya dengan Bash dalam lingkungan ekstrem yang tidak bisa membuat proses baru
1 komentar
Komentar Hacker News
Lelucon bahwa masalah tersulit dalam ilmu komputer pada akhirnya adalah menyelaraskan perataan terasa sangat mengena
Saya sudah berkali-kali menulis fungsi penyelarasan kolom dalam berbagai bahasa, dan setiap kali selalu menyakitkan; di kepala terlihat sederhana seperti “hitung panjang maksimum tiap kolom lalu tambahkan spasi sampai kelipatan ukuran tab berikutnya”
Bahkan dengan f-string dan fitur padding di Python, kodenya cepat menjadi rumit dan sulit dibaca; saking buruknya, saat menulis ulang contoh untuk komentar saja saya memperbaiki beberapa bug
Untuk penggunaan yang begitu umum, rasanya wajar kalau ada library-nya, dan jujur saja agak mengejutkan bahwa ini tidak ada di standard library
Caranya mengambil lebar dan nama kolom dari
descriptionmilik cursor database, lalu membuat garis pemisah dan string format sebelum mencetak baris; entah apakah ada bug fatal yang saya lewatkan, tapi ini tidak terlihat seperti masalah yang terlalu sulitzip(*table)untuk membalik tabel menjadi kolom, mencari panjang maksimum tiap kolom, lalu mencetaknya sejajar denganf"{r:<{w}}"Contoh hasilnya menjadi tabel dengan lebar kolom yang selaras, seperti
agony | kick | pumpNilai bisa berisi spasi, dipadding dengan spasi, kadang perataannya meleset, dan kadang isinya meluber melewati kolom
Sepertinya akan lebih menguntungkan semua pihak kalau kita sepakat untuk tidak memakai data berformat perataan kolom, dan memakai format lain yang lebih sederhana namun tetap bisa dibaca manusia
Kalau saya masuk lewat SSH ke sebuah mesin dan shell Bash masih hidup tetapi semua PID sudah habis sehingga tidak bisa membuat proses baru, saya akan menelusuri filesystem
/proc/[pid]/untuk mencari proses mana yang menghabiskan ruang PIDkilldi Bash adalah perintah bawaan shell, jadi tidak perlu melakukan fork proses baru seperti/bin/killKalau bisa menemukan proses induk yang melahirkan anak-anak yang menghabiskan PID, kita bisa menghentikannya dan mengambil kembali kendali atas sistem
Skrip ini juga mem-parse
/proc, dan cukup rapi karena tidak memakai pipe atau substitusi$(...)yang akan membuat subshell Bash baruDengan begitu kita bisa memanggil fungsi-fungsi POSIX yang diperlukan tanpa menjalankan perintah terpisah, dan responsnya cukup bagus
Memulihkan setelah reboot bisa lebih cepat daripada mencari dan membunuh proses induk dalam lingkungan terbatas, dan kalau PID sudah habis, kemungkinan besar hal-hal lain juga sudah dalam kondisi buruk
ps(){ (cd /proc;for i in [0-9]*;do echo $i: $(tr '\0' ' ' < $i/cmdline);done); }/proc/[pid]/guna mencari proses mana yang menghabiskan ruang PID memang tepat, tetapi dari komentar di source code terlihat bahwa awalnya mereka berharap/proc/*/statussaja sudah cukup, namun nilai seperti penggunaan CPU tidak bisa didapat dari sana[[ $cmdline ]] && exec {cmdline}>&-danexec {cmdline}< "$dir"/cmdline || continuebekerjaPada 2011 saya mengikuti wawancara untuk peran SRE di sebuah perusahaan teknologi AS yang cukup besar; saat itu istilah SRE pun baru pertama kali saya dengar
Perusahaan itu sedang membuat alternatif MS Office berbasis browser, dan setelah phone screening saya harus melakukan pemrograman real-time sambil berbicara dengan pewawancara di dalam editor dokumen milik perusahaan tersebut
Karena saya menulis nilai tinggi untuk
shell scriptingdanLinuxdi formulir penilaian diri, saya diberi tugas membuat penggantinetstatdengan Bash, tetapi saat itu saya tidak tahu informasi socket ada di bagian mana dan dalam format apa di/proc/, jadi saya cepat menyimpulkan tidak bisa melakukannyaSebagai gantinya, saya mengusulkan membuat versi mini dari
psdanfuser, dan solusi yang saya tulis di dalam word processor berbasis browser yang mengerikan itu diterima, hingga saya lolos ke wawancara onsiteKalau dipikir sekarang, mungkin skenario hipotetis yang memotivasi latihan ini ternyata lebih berakar pada kenyataan daripada dugaan saya
Saya pun akan mulai dari sana
Dulu saya pernah membuat situs web interaktif untuk bersenang-senang, yang mengeksplorasi situasi ketika sudah masuk lewat SSH tetapi tidak bisa membuat proses baru: https://oops.cmdchallenge.com
"echo *"tidak mencantumkan semua file dalam direktoriHarus memakai
"echo .* *"Saya ingin melihat daftar
"View Solutions"untuk tahap lain agar bisa mengecek pendekatan lain apa saja yang mungkinIzabera adalah salah satu jagoan di #bash@libera
Sejak masa freenode dulu, saya benar-benar banyak belajar dari para jagoan seperti itu selama 10 tahun terakhir
Ini Bash yang cukup rapi
Dari pengalaman, kode Bash biasanya sering ditulis buruk dan tidak efisien, tetapi kode ini terlihat sebagai contoh bagus yang tidak seperti itu
Bagaimana kalau kita sedang berada di shell POSIX tepercaya yang tidak mendukung Bash?
Skrip Bash ini tidak kompatibel dengan POSIX
Skrip ini tidak berjalan di Bash 3.2, tetapi berjalan di Bash 4.2
Di Bash 3.2 muncul error
printf: '(': invalid format character, dan lingkungan contohnya adalahbash-3.2-33.el5_11.4.0.1Kegunaan yang lebih baik mungkin untuk melihat daftar proses di sistem yang tidak memasang procps
Lumayan
Dengan Bash, listener dan client juga memang bisa dibuat
Tidak saya rekomendasikan untuk penggunaan nyata