Saya telah menjalankan bash contoh (di dalam screen session) yang mengeksekusi sekumpulan perintah kompleks di dalam satu loop (dengan setiap loop melakukan pipa, pengalihan, dll).
Baris perintah yang panjang ditulis di dalam terminal – tidak ada di dalam skrip apa pun. Sekarang, saya tahu ID proses bash, dan saya memiliki akses root – bagaimana saya bisa melihat baris perintah yang tepat dieksekusi di dalam bash itu ?
Contoh
bash$ echo $$
1234
bash$ while true ; do
someThing | somethingElse 2>/foo/bar |
yetAnother ; sleep 600 ; done
Dan dalam contoh shell lain, saya ingin melihat baris perintah dieksekusi di dalam PID 1234:
bash$ echo $$
5678
bash$ su -
sh# cd /proc/1234
sh# # Do something here that will display the string
'while true ; do someThing | somethingElse 2>/foo/bar |
yetAnother ; sleep 600 ; done'
Apakah ini mungkin?
EDIT #1
Menambahkan contoh tandingan untuk beberapa jawaban yang saya dapatkan.
-
Tentang menggunakan
cmdlinedi bawah/proc/PID:itu tidak berhasil, setidaknya tidak dalam skenario saya. Berikut ini contoh sederhananya:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; doneDi shell lain:
$ cat /proc/8909/cmdline bash -
Menggunakan
ps -p PID --noheaders -o cmdsama tidak bergunanya:$ ps -p 8909 --no-headers -o cmd bash -
ps -eafjuga tidak membantu:$ ps -eaf | grep 8909 ttsiod 8909 8905 0 10:09 pts/0 00:00:00 bash ttsiod 30697 8909 0 10:22 pts/0 00:00:00 sleep 30 ttsiod 31292 13928 0 10:23 pts/12 00:00:00 grep --color=auto 8909Artinya, tidak ada output dari baris perintah ASLI, yang saya cari – yaitu
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done.
Jawaban yang Diterima:
Saya tahu saya sulit, tetapi UNIX tidak pernah gagal!
Begini cara saya mengelolanya:
bash$ gdb --pid 8909
...
Loaded symbols for /lib/i386-linux-gnu/i686/cmov/libnss_files.so.2
0xb76e7424 in __kernel_vsyscall ()
Kemudian pada (gdb) prompt Saya menjalankan perintah, call write_history("/tmp/foo") yang akan menulis riwayat ini ke file /tmp/foo .
(gdb) call write_history("/tmp/foo")
$1 = 0
Saya kemudian melepaskan diri dari proses.
(gdb) detach
Detaching from program: /bin/bash, process 8909
Dan keluar dari gdb .
(gdb) q
Dan tentu saja…
bash$ tail -1 /tmp/foo
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Untuk penggunaan kembali yang mudah di masa mendatang, saya menulis skrip bash, mengotomatiskan prosesnya.