Στο Linux, πολλά αντικείμενα θεωρούνται αρχείο, ανεξάρτητα από το αν το αντικείμενο είναι στην πραγματικότητα αρχείο, συσκευή, κατάλογος ή υποδοχή. Η καταχώριση ενός αρχείου είναι εύκολη, υπάρχει το ενσωματωμένο κέλυφος lsγια αυτό. Τι θα γινόταν όμως αν ένας χρήστης ήθελε να δει ποια αρχεία ανοίγουν αυτήν τη στιγμή από τη διαδικασία του διακομιστή web; Ή αν αυτός ο χρήστης ήθελε να μάθει ποια αρχεία ανοίγονται σε έναν συγκεκριμένο κατάλογο; Εκεί lsofμπαίνει στο παιχνίδι. Φανταστείτε lsofως ένα lsμε την προσθήκη "ανοιχτών αρχείων".
Λάβετε υπόψη ότι ενώ τα BSD έχουν διαφορετικό βοηθητικό πρόγραμμα για αυτήν τη δουλειά fstat, πολλές άλλες γεύσεις Unix (για παράδειγμα το Solaris) διαθέτουν επίσης lsof. Οι επιλογές και οι σημαίες είναι διαφορετικές στις άλλες πλατφόρμες, καθώς και η εμφάνιση της εξόδου, αλλά γενικά οι γνώσεις σε αυτό το άρθρο θα πρέπει να ισχύουν και για αυτές.
Αρχικά, ας ρίξουμε μια ματιά στη μορφή της lsofεξόδου και πώς πρέπει να διαβαστεί. Η συνηθισμένη έξοδος lsofχωρίς καμία παράμετρο θα μοιάζει με την ακόλουθη. Αυτό έχει περικοπεί για αναγνωσιμότητα.
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 254,1 4096 2 /
init 1 root rtd DIR 254,1 4096 2 /
init 1 root txt REG 254,1 36992 7077928 /sbin/init
init 1 root mem REG 254,1 14768 7340043 /lib/x86_64-linux-gnu/libdl-2.13.so
init 1 root mem REG 254,1 1603600 7340040 /lib/x86_64-linux-gnu/libc-2.13.so
init 1 root mem REG 254,1 126232 7340078 /lib/x86_64-linux-gnu/libselinux.so.1
init 1 root mem REG 254,1 261184 7340083 /lib/x86_64-linux-gnu/libsepol.so.1
init 1 root mem REG 254,1 136936 7340037 /lib/x86_64-linux-gnu/ld-2.13.so
init 1 root 10u FIFO 0,14 0t0 4781 /run/initctl
Αυτές οι στήλες σημαίνουν τα εξής:
- ΕΝΤΟΛΗ - Η διαδικασία στην οποία ανήκει ένα ανοιχτό αρχείο, σε αυτό το παράδειγμα όλα σχετίζονται με το
init.
- PID - Ο αριθμός αναγνώρισης διεργασίας της εν λόγω διαδικασίας.
- ΧΡΗΣΤΗΣ - Ο χρήστης κάτω από τον οποίο εκτελείται η διαδικασία. Για
init, είναι σχεδόν πάντα root.
- FD - Ο περιγραφέας αρχείου του αρχείου, ο πιο συνηθισμένος είναι:
cwd- Ο τρέχων κατάλογος εργασίας (μπορεί να παρατηρήσετε την ομοιότητα με την pwdεντολή που εκτυπώνει τον τρέχοντα κατάλογο εργασίας).
rtd - Ο ριζικός κατάλογος μιας διεργασίας.
txt- A text file, αυτό μπορεί να σημαίνει είτε ένα αρχείο διαμόρφωσης που σχετίζεται με τη διαδικασία είτε τον "πηγαίο κώδικα" που σχετίζεται (ή ανήκει) στη διαδικασία.
mem - Ένα λεγόμενο "αρχείο αντιστοίχισης μνήμης", που σημαίνει ένα τμήμα εικονικής μνήμης (ανάγνωση: RAM) που έχει εκχωρηθεί σε ένα αρχείο.
- Ένας αριθμός - ο αριθμός αντιπροσωπεύει την πραγματική περιγραφή του αρχείου, ο χαρακτήρας μετά τον αριθμό είναι ο τρόπος με τον οποίο ανοίγει το αρχείο:
r - Ανάγνωση.
w - Γράψε.
u - Διάβασε και γράψε.
- TYPE - Καθορίζει τον πραγματικό τύπο του αρχείου, τα πιο συνηθισμένα είναι:
REG - Ένα κανονικό αρχείο.
DIR - Ένας κατάλογος.
FIFO - Πρώτος μέσα, πρώτος έξω.
- ΣΥΣΚΕΥΗ - Ο κύριος και ο δευτερεύων αριθμός της συσκευής που περιέχει το αρχείο.
- SIZE - Το μέγεθος του αρχείου, σε byte.
- NODE - Ο αριθμός inode του αρχείου.
- NAME - Το όνομα του αρχείου.
Αυτό μπορεί να είναι λίγο συντριπτικό προς το παρόν, αλλά αν το δουλέψετε lsofμερικές φορές, θα βυθιστεί γρήγορα στον εγκέφαλό σας.
Όπως αναφέρθηκε παραπάνω, η έξοδος του lsofέχει μειωθεί εδώ. Χωρίς ορίσματα ή φίλτρα, lsofπαράγει εκατοντάδες γραμμές εξόδου που μόνο σύγχυση θα σας αφήσουν.
Υπάρχουν δύο βασικές προσεγγίσεις για την επίλυση αυτού του προβλήματος:
- Χρησιμοποιήστε μία ή περισσότερες από τις
lsofεπιλογές της γραμμής εντολών για να περιορίσετε τα αποτελέσματα.
- Διοχετεύστε την έξοδο μέσω, για παράδειγμα,
grep.
Αν και η τελευταία επιλογή μπορεί να ακούγεται πιο άνετη, καθώς δεν θα χρειαστεί να απομνημονεύσετε τις lsofεπιλογές της γραμμής εντολών, γενικά δεν είναι τόσο ευέλικτη και αποτελεσματική, επομένως θα παραμείνουμε στην πρώτη.
Ας φανταστούμε ότι θέλετε να ανοίξετε ένα αρχείο με το αγαπημένο σας πρόγραμμα επεξεργασίας κειμένου και ότι το πρόγραμμα επεξεργασίας κειμένου σας λέει ότι μπορεί να ανοίξει μόνο σε λειτουργία μόνο για ανάγνωση επειδή ένα άλλο πρόγραμμα έχει ήδη πρόσβαση σε αυτό. lsofθα σας βοηθήσει να μάθετε ποιος είναι ο δράστης:
lsof /path/to/your/file
Αυτό θα παράγει μια έξοδο παρόμοια με αυτό:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 2679 root 5w REG 254,1 121525 6035622 /root/lsof.txt
Προφανώς, ξεχάσατε να κλείσετε και παλαιότερη συνεδρία! Ένα πολύ παρόμοιο πρόβλημα συμβαίνει όταν προσπαθείτε να αποπροσαρτήσετε ένα κοινόχρηστο στοιχείο NFS και umountσας λέει ότι δεν μπορεί επειδή κάτι εξακολουθεί να έχει πρόσβαση στον προσαρτημένο φάκελο. Και πάλι, lsofμπορεί να σας βοηθήσει να εντοπίσετε τον ένοχο:
lsof +D /path/to/your/directory/
Προσέξτε την τελευταία κάθετο, αυτό είναι σημαντικό. Διαφορετικά, lsofθα υποθέσουμε ότι εννοείτε ένα κανονικό αρχείο. Μην σας μπερδεύει το +μπροστινό μέρος της σημαίας - lsofέχει τόσες πολλές επιλογές γραμμής εντολών που χρειάζεται +εκτός από τις πιο συνηθισμένες -. Η έξοδος θα μοιάζει με αυτό:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mocp 5637 music 4r REG 0,19 10147719 102367344 /home/Music/RMS_GNU_SONG.ogg
Αυτό σημαίνει ότι η διαδικασία mocp, με το PID 5637, που ανήκει στον χρήστη musicέχει ανοίξει ένα αρχείο που ονομάζεται RMS_GNU_SONG.ogg. Ωστόσο, ακόμη και μετά το κλείσιμο αυτής της διαδικασίας, εξακολουθεί να υπάρχει πρόβλημα - δεν είναι δυνατή η αποπροσάρτηση του τόμου NFS.
lsofέχει μια -cσημαία που εμφανίζει αρχεία που έχουν ανοίξει ένα αυθαίρετο όνομα διεργασίας.
lsof -c mocp
Αυτό θα παράγει ένα αποτέλεσμα που μοιάζει με αυτό:
mocp 9383 music 4r REG 0,19 10147719 102367344 /home/Music/ANOTHER_RMS_GNU_SONG.ogg
Σε αυτό το παράδειγμα, υπάρχει μια άλλη περίπτωση mocpεκτέλεσης, η οποία σας εμποδίζει να αποσυνδέσετε το κοινόχρηστο στοιχείο. Μετά τον τερματισμό αυτής της διαδικασίας, θέλετε να βεβαιωθείτε ότι ο χρήστης musicδεν έχει ανοιχτά άλλα δυνητικά προβληματικά αρχεία. lsofέχει μια -uσημαία για την εμφάνιση αρχείων που έχουν ανοίξει από έναν συγκεκριμένο χρήστη. Θυμηθείτε, ένα αρχείο δεν είναι πάντα απλώς ένα κανονικό αρχείο στον σκληρό σας δίσκο!
lsof -u music
Μπορείτε επίσης να περάσετε πολλούς χρήστες, διαχωρισμένους με κόμματα:
lsof -u music,moremusic
Μια σημαντική σημείωση σχετικά με την προεπιλεγμένη συμπεριφορά του lsof: τα αποτελέσματα βασίζονται στο Ή , πράγμα που σημαίνει ότι θα δείτε αποτελέσματα αρχείων που ανοίγονται από διεργασίες που ανήκουν είτε στον χρήστη musicείτε στον χρήστη moremusic. Εάν θέλετε να δείτε αποτελέσματα που αντιστοιχούν σε διαδικασίες που ανήκουν και στους δύο χρήστες, τότε θα πρέπει να περάσετε τη σημαία -a:
lsof -au music, moremusic
Εφόσον και οι δύο χρήστες ανήκουν στην ομάδα musicusers, μπορείτε επίσης να παραθέσετε αρχεία με βάση την ομάδα:
lsof -g musicusers
Μπορείτε επίσης να συνδυάσετε σημαίες γραμμής εντολών:
lsof -u music,moremusic -c mocp
or
lsof -u ^music +D /home/Music
Στην τελευταία γραμμή, προσθέσαμε μια άλλη ειδική σημαία - ^, η οποία σημαίνει ένα λογικό ΟΧΙ . Εάν η έξοδος είναι άδεια μετά την εκτέλεση αυτής της εντολής, τότε η αποπροσάρτηση πιθανότατα θα είναι επιτυχής.
Στα προηγούμενα παραδείγματα, εξετάσαμε κυρίως τα κανονικά αρχεία. Τι θα λέγατε για τις υποδοχές και τις συνδέσεις δικτύου;
Για να παραθέσετε όλες τις τρέχουσες συνδέσεις δικτύου lsofέχει τη -iσημαία:
lsof -i
Το αποτέλεσμα μοιάζει με αυτό που έχουμε δει μέχρι τώρα...
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
owncloud 3509 myuser 25u IPv4 44946 0t0 TCP strix.local:34217->myserver.vultr.com:https (ESTABLISHED)
firefox 3612 myuser 82u IPv4 49663 0t0 TCP strix.local:43897->we-in-f100.1e100.net:https (ESTABLISHED)
ssh 3784 myuser 3u IPv4 10437 0t0 TCP strix.local:51416->someserver.in:ssh (ESTABLISHED)
wget 4140 myuser 3w IPv4 45586 0t0 TCP strix.local:54460->media.ccc.de:http (CLOSE_WAIT)
... εκτός από μία διαφορά: αντί για ονόματα αρχείων ή καταλόγους, η στήλη NAMEεμφανίζει τώρα πληροφορίες σύνδεσης. Κάθε σύνδεση αποτελείται από τα ακόλουθα μέρη:
- Πρωτόκολλο.
- Τοπικό όνομα κεντρικού υπολογιστή.
- Θύρα πηγής της σύνδεσης.
- Όνομα DNS προορισμού.
- Λιμάνι προορισμού.
- Κατάσταση της σύνδεσης.
Όπως και με πολλά άλλα εργαλεία, μπορείτε να εξαιρεθείτε από την επίλυση ονομάτων και θυρών DNS ( -nκαι -P, αντίστοιχα). Η σημαία -iλαμβάνει πρόσθετες παραμέτρους. Μπορείτε να καθορίσετε εάν θα εμφανίζονται ή όχι tcp, udpή icmpσυνδέσεις ή ορισμένες θύρες:
lsof -i :25
or
lsof -i :smtp
Και πάλι, οι παράμετροι μπορούν να συνδυαστούν. Το παρακάτω παράδειγμα...
lsof -i tcp:80
... θα σας δείξει μόνο συνδέσεις TCP χρησιμοποιώντας τη θύρα 80. Μπορείτε επίσης να το συνδυάσετε με τις επιλογές που γνωρίζετε ήδη από τα "κλασικά" αρχεία:
lsof -a -u httpd -i tcp
Αυτό θα σας δείξει όλες τις συνδέσεις TCP που άνοιξε ο χρήστης httpd. Σημειώστε τη -aσημαία, η οποία αλλάζει την προεπιλεγμένη συμπεριφορά του lsof(όπως αναφέρθηκε προηγουμένως). Όπως με τα περισσότερα εργαλεία γραμμής εντολών, μπορείτε να πάτε εξαιρετικά βαθιά. Τα παρακάτω θα σας εμφανίσουν μόνο συνδέσεις TCP των οποίων η κατάσταση είναι "ΕΓΚΑΤΑΣΤΑΣΗ":
lsof -i -s TCP:ESTABLISHED
Σε αυτό το σημείο, θα πρέπει να έχετε μια βασική κατανόηση για το πώς lsofλειτουργεί, μαζί με ορισμένες συνήθεις περιπτώσεις χρήσης. Για περαιτέρω ανάγνωση, ανατρέξτε στη σελίδα διαχείρισης του lsofστο σύστημά σας.