mencoba menggabungkan perintah untuk memberikan path file

0

Saya mencoba menggabungkan beberapa perintah untuk memberikan path file.

Saya perlu menjalankan ini:

ls -l /proc/{PID}/fd/{FILE_NAME}

Saya bisa mendapatkan PID dengan menjalankan:

lsof | grep 'mysql\(.*\)deleted' | awk { print $2 }'

Dan saya bisa mendapatkan nama file dengan menjalankan:

lsof | grep 'mysql\(.*\)deleted' | awk { print $10 } | cut -d'/' -f3

Keduanya memberi saya daftar panjang yang bagus, tetapi bagaimana saya bisa menggunakannya untuk menghasilkan path file untuk perintah ls?

Chris
sumber
Tolong tunjukkan sampel daftar.
choroba
Saya tidak punya cara sekarang untuk menyalinnya dari server di mana saja, tetapi yang pertama adalah daftar baris yang terpisah dari PID dan yang kedua adalah daftar nama file yang dipisahkan baris
Chris
Bisakah nama file berisi spasi?
choroba
nama file tidak mengandung spasi no.
Chris
Coba jalankan lsof | grep 'deleted' dan Anda akan melihat apa yang saya maksud.
Chris

Jawaban:

3

Dalam bash, Anda dapat menggunakan array:

#!/bin/bash
pids=( $(lsof | grep 'mysql.*deleted' | awk '{ print $2 }') )
files=( $(lsof | grep 'mysql.*deleted' | awk '{ print $10 }' | cut -d/ -f3) )
for ((i=0; i<${#pids[@]}; i++)) ; do
    ls -l /proc/${pids[i]/fd/${files[i]}
done

Kemungkinan lain adalah membaca dari dua aliran:

while read pid ; do
    read file <&3
    ls -l /proc/$pid/fd$file
done < <(lsof | grep 'mysql.*deleted' | awk '{ print $2 }') \
     3< <(lsof | grep 'mysql.*deleted' | awk '{ print $10 }' | cut -d'/' -f3)
choroba
sumber
@ Chris: Periksa pembaruan.
choroba