Daftar Isi

Optimisasi Mikro dan Portabilitas dalam Shell-script #3

Shell-scripting mindset shift pt. 3 of 7


بِسْمِ ٱللَّٰهِ ٱلرَّحْمَٰنِ ٱلرَّحِيمِ

Process Substitution

Seperti biasanya, melakukan piping antar executable memanglah praktis. Namun, teknik tersebut hanya berlaku untuk satu output (stdout) dari sebuah perintah untuk dialihkan ke perintah tunggal yang lain menjadi inputnya. Lalu, bagaimana jika ingin mengalihkan output dari beberapa perintah? Seperti sebelumnya di Mengakali utilitas yang tidak mendukung I/O redirection dan input ganda. Karena sesederhana itu, alih-alih menjelaskan lebih lanjut mengenai penggunaanya, kita akan menjelaskan konsep dari substitusi proses sebagaimana itu bekerja dengan memanfaatkan FIFO.


Named Pipe (FIFO)

File khusus FIFO (first in, first out) atau named pipe mirip dengan pipe shell. FIFO dapat dibuka dengan beberapa proses untuk membaca atau menulis. Ketika proses bertukar data melalui FIFO, kernel melewatkan semua data secara internal tanpa menulisnya ke filesystem. Dengan demikian, file FIFO tidak memiliki data di dalam filesystem. Entri filesystem hanya berfungsi sebagai titik referensi, sehingga proses dapat mengakses pipeline menggunakan nama file dalam filesystem. Itulah mengapa disebut named pipe. Kernel mempertahankan tepat satu objek pipe untuk setiap file FIFO yang dibuka oleh setidaknya satu proses. FIFO harus dibuka pada keduanya (membaca dan menulis) sebelum data input dan output dapat dilewatkan. Membuka FIFO untuk membaca biasanya memblokir sampai beberapa proses lain membuka FIFO yang sama untuk menulis, dan sebaliknya. Tidak seperti anonymous pipe (atau unnamed pipe) yang selalu ada selama prosesnya ada, named pipe selalu ada selama file ada di filesystem, dan juga dapat dihapus jika sudah tidak lagi diperlukan.

1
mkfifo /tmp/vfd{11,12} # Virtual file descriptor dengan `mkfifo`, GNU coreutils.
1
2
file /tmp/ > /tmp/vfd11 & # Clobbering. Alihkan output perintah 1 ke vfd11, dan
file /var/tmp/ > /tmp/vfd12 & # juga alihkan perintah 2 ke vfd12.
1
diff -u /tmp/vfd11 /tmp/vfd12 # Contoh ini sebagai pembanding substitusi proses.
/proc/self/fd/1
1
2
3
4
5
--- /tmp/vfd11	2022-05-06 22:32:25.074146609 +0700
+++ /tmp/vfd12	2022-05-06 22:32:25.074146609 +0700
@@ -1 +1 @@
-/tmp/: sticky, directory
+/var/tmp/: sticky, directory

Hasilnya terlihat sama bukan? Yap, begitulah konsep dasar dari substitusi proses (anonymous pipe). Pembedanya adalah substitusi proses merupakan fitur spesifik shell tertentu untuk kepraktisan, itu memang tidak didefinisikan oleh POSIX. Sebenarnya perintah di dalam tanda kurung (<()) dalam substitusi proses dieksekusi di dalam subshell di mana shell utama mengklon dirinya sendiri, dan klonnya menginterpretasikan perintah di dalam tanda kurung. Oleh karena itu, shell utama hanya menjalankan satu perintah, dan output dari satu set perintah tersebut dialihkan sebagai satu unit.

1
rm -v /tmp/vfd* # Hapus file named pipe (FIFO) yang sudah tidak lagi diperlukan.
/proc/self/fd/1
removed ‘/tmp/vfd11’
removed ‘/tmp/vfd12’

Kegunaan FIFO lebih primitif daripada socket. FIFO memungkinkan berbagai proses terpisah (yang secara eksplisit dirancang tidak bekerja sama) untuk saling berkomunikasi satu arah (unidirectional).

Perlu diperhatikan. Jika beberapa proses mencoba membaca FIFO yang sama maka kernel akan memilih secara acak proses yang membacanya. Jadi, itu tidak dimungkinkan untuk melewatkan data yang sama ke semua proses yang membaca satu FIFO secara bersama-sama (non-simultaneous).


RT Telecooperation

Ini berguna untuk telecooperation dua user di mana salah satunya bertindak sebagai monitor untuk mengawasi semua aktivitas sesi shell target secara real-time. Ini sedikit mengorbankan performa.

1
cat /tmp/vfd11 # Inisiasikan membaca vfd11 dengan utilitas `cat`, GNU coreutils.
1
exec script -f /tmp/vfd11 -q # Flush (tulis) setiap output target ke vfd11.
Mengantisipasi kecurigaan user target dari logger setelah sesi shell target berakhir.

Program script akan mencatat semua aktivitas ke dalam proses shell baru sebagai anak proses dari proses script tersebut. Ketika sesi shell itu berakhir, itu akan kembali ke proses shell utama di mana kita menjalankan program script. Untuk mengantisipasi hal tersebut, kita dapat menggunakan perintah exec bawaan untuk mengganti proses shell utama dengan proses script. Sehingga, ketika script dieksekusi maka proses shell utama akan diakhiri seketika, dan ketika proses shell dari proses script diakhiri maka sesi shell target diakhiri seolah-olah tidak terjadi pengintaian. Namun, proses script tetap terlihat sebagai ibu proses.

Penggunaan program script (dari util-linux) lebih lanjut dapat kalian lihat di manpage-nya.

1
man 1 script
/proc/self/fd/1
Script started on 2022-05-07 15:37:19+07:00 [TERM=“rxvt-unicode-256color” TTY="/dev/pts/2" COLUMNS=“180” LINES=“32”]

Lanjutkan ke Halaman

#1 #2 #3 #4 #5 #6 #7