Saya memiliki bash
instance berjalan lama (di dalam screen
sesi) yang mengeksekusi serangkaian perintah yang kompleks di dalam loop (dengan setiap loop melakukan pipa, pengalihan, dll).
Baris perintah 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 dalamnya bash
?
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 balasan untuk beberapa jawaban yang saya dapatkan.
Tentang menggunakan di
cmdline
bawah/proc/PID
: itu tidak berhasil, setidaknya tidak dalam skenario saya. Berikut ini contoh sederhana:$ 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 berguna:$ 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 ORIGINAL, yang saya cari - yaitu
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.
gdb
:print (char *)rl_line_buffer
. Perintah saat ini secara berurutan adalahprint (char *)the_printed_command
. Anda mungkin jugacall history_builtin()
, tetapi itu akan menghasilkan pada tty dari proses bash, jadi mungkin kurang bermanfaat.Karena perintah masih berjalan di layar, bash induknya belum membaca ulang riwayat apa pun jadi:
^Z
laluup arrow
^A^A
- karena layar (1) - dan^E
) dan gema + redirect ke filefg
untuk mengejar eksekusi perintahAda peringatan, tetapi ini cukup berguna, sebagian besar waktu.
sumber
up
. Meskipun Anda harus yakin bahwa itu akan mulai lagi tanpa masalah, tetapi jika tidak maka Anda akan memiliki masalah yang sama setelah reboot. Anda hanya harus memilih saat ketika downtime tidak menjadi masalah.Saya tahu Anda menemukan jawaban Anda sendiri, tetapi adakah alasan Anda tidak dapat melakukan hal seperti ini:
Mungkin Anda tidak dapat menggabungkan output dari pekerjaan aktual dan output dari bash yang menunjukkan baris yang sedang dijalankan.
Juga, FWIW, jika Anda lebih suka verbositas
set -o xtrace
,.sumber