GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Melihat Baris Perintah yang Tepat Dieksekusi Di Dalam Beberapa Instance Bash?

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.

  1. 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
    
  2. Menggunakan ps -p PID --noheaders -o cmd sama tidak bergunanya:

    $ ps -p 8909 --no-headers -o cmd
    bash
    
  3. 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.


Linux
  1. Cara Menghapus Riwayat Baris Perintah BASH di Linux

  2. Bash Echo Baris Perintah Dieksekusi Di Baris Perintah Itu Sendiri (bukan Dalam Script)?

  3. Bagaimana Cara Memulai Ulang Icewm Dari Baris Perintah?

  1. Cara menggemakan Baris Baru di Bash Shell Script

  2. Bagaimana cara Mengirim Email dari Baris Perintah?

  3. Bagaimana cara mendapatkan alamat IP saya dari baris perintah?

  1. Kiat bash untuk sehari-hari di baris perintah

  2. Cara Membuat Database di MySQL Menggunakan Command Line

  3. Bagaimana cara menambahkan ikon ke prompt bash