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
cmdline
di 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 ; done
Di shell lain:
$ cat /proc/8909/cmdline bash
-
Menggunakan
ps -p PID --noheaders -o cmd
sama tidak bergunanya:$ ps -p 8909 --no-headers -o cmd bash
-
ps -eaf
juga 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 8909
Artinya, 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.