1 poin oleh GN⁺ 2024-07-30 | 1 komentar | Bagikan ke WhatsApp
  • izabera/ps adalah implementasi Bash untuk meniru keluaran yang mirip dengan ps aux di dalam Bash, bahkan dalam situasi ketika proses baru tidak dapat dibuat
  • Kondisi utamanya adalah ketika pada mesin yang diakses lewat ssh ada 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 aux yang 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 aux hanya dengan Bash
  • Judul README adalah “ps aux written 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
  • README memperkenalkan bahwa dalam kondisi seperti ini, fungsi yang mirip ps aux bisa saja diperlukan

Cakupan yang bisa diharapkan dan caveat

  • Alat ini diperkenalkan untuk memungkinkan pengguna “kinda sorta pretend” seolah memiliki ps aux yang 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 aux hanya dengan Bash dalam lingkungan ekstrem yang tidak bisa membuat proses baru

1 komentar

 
GN⁺ 2024-07-30
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

    • Saya pernah menambahkan Pandas ke sebuah proyek hanya karena tidak mau menulis sendiri kode semacam ini untuk mencetak tabel yang rapi
      Untuk penggunaan yang begitu umum, rasanya wajar kalau ada library-nya, dan jujur saja agak mengejutkan bahwa ini tidak ada di standard library
    • https://perldoc.perl.org/perlform
    • Dulu saya pernah menjawab di Stack Overflow dengan solusi O(n): https://stackoverflow.com/questions/10865483/print-results-i...
      Caranya mengambil lebar dan nama kolom dari description milik 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 sulit
    • Yang lebih sederhana, bisa memakai zip(*table) untuk membalik tabel menjadi kolom, mencari panjang maksimum tiap kolom, lalu mencetaknya sejajar dengan f"{r:<{w}}"
      Contoh hasilnya menjadi tabel dengan lebar kolom yang selaras, seperti agony | kick | pump
    • Sebaliknya, dari sudut pandang orang yang sering harus mem-parse data yang disejajarkan per kolom, ini juga tidak mudah
      Nilai 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 PID
    kill di Bash adalah perintah bawaan shell, jadi tidak perlu melakukan fork proses baru seperti /bin/kill
    Kalau 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 baru

    • Dalam wawancara, saya pernah menjawab “exec Python
      Dengan begitu kita bisa memanggil fungsi-fungsi POSIX yang diperlukan tanpa menjalankan perintah terpisah, dan responsnya cukup bagus
    • Jujur saja, kalau saya mungkin akan reboot saja
      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
    • Kalau hanya ingin melihat PID dan nama perintah, bentuk yang nyaris minimal juga bisa seperti ini: ps(){ (cd /proc;for i in [0-9]*;do echo $i: $(tr '\0' ' ' < $i/cmdline);done); }
    • Gagasan untuk melihat /proc/[pid]/ guna mencari proses mana yang menghabiskan ruang PID memang tepat, tetapi dari komentar di source code terlihat bahwa awalnya mereka berharap /proc/*/status saja sudah cukup, namun nilai seperti penggunaan CPU tidak bisa didapat dari sana
    • Terkait subprocess, saya sungguh penasaran bagaimana [[ $cmdline ]] && exec {cmdline}>&- dan exec {cmdline}< "$dir"/cmdline || continue bekerja
  • Pada 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 scripting dan Linux di formulir penilaian diri, saya diberi tugas membuat pengganti netstat dengan 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 melakukannya
    Sebagai gantinya, saya mengusulkan membuat versi mini dari ps dan fuser, dan solusi yang saya tulis di dalam word processor berbasis browser yang mengerikan itu diterima, hingga saya lolos ke wawancara onsite
    Kalau dipikir sekarang, mungkin skenario hipotetis yang memotivasi latihan ini ternyata lebih berakar pada kenyataan daripada dugaan saya

    • Beberapa utilitas sistem seperti ini kemungkinan besar memang melihat ke dalam procfs/sysfs di balik layar
      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 direktori
      Harus memakai "echo .* *"
    • Keren sih, tetapi setelah menyelesaikannya saya langsung dikembalikan ke tahap pertama dan tidak bisa melihat tahap-tahap lain, jadi terasa menjengkelkan
      Saya ingin melihat daftar "View Solutions" untuk tahap lain agar bisa mengecek pendekatan lain apa saja yang mungkin
  • Izabera 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

    • Kalau disebut Bash yang rapi, seharusnya juga portabel, tetapi skrip ini khusus Linux dan akan rusak parah di tempat lain
  • 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 adalah bash-3.2-33.el5_11.4.0.1

    • Menurut saya, tidak mendukung lini rilis Bash berusia 18 tahun dan lini rilis sistem operasi berusia 17 tahun itu cukup masuk akal
  • Kegunaan 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