هر چیزی در یونیکس ها و لینوکس فایل است. کاربران و فرایند ها بصورت مداوم و همیشگی با برخی از فایل ها کار می کنند. مثلن یک CMD با برخی از فایل های کتابخانه C و یک فایل پیکربندی در حال کار کردن است. فایل ها در دایرکتوری ها ذخیره میشوند. این که می گوییم در یونیکس ها و لینوکس همه چیز فایل است فقط به فایل های متنی و دیگر فایل های مرسوم ختم نمی شود، بلکه حتی اتصال های شبکه و سخت افزار ها نیز فایل هستند و این فایل ها توسط کاربران،سرویس ها و فرایند ها مورد استفاده قرار می گیرند
بدون در نظر گرفتن نوع فایل، هر فایلی در یونیکس ها و لینوکس ها دارای یک File Descriptor میباشد که در خروجی دستور lsof با FD نشان داده می شود. FD اطلاعات جامعی از یک فایل به شما میدهد. lsof مخفف List Open File می باشد که در تمامی سیستم عامل های مبتنی بر یونیکس مانند BSD ها و توزیع های لینوکسی موجود و قابل استفاده می باشد. ساده ترین شکل استفاده آن بصورت زیر می باشد (خروجی دستور lsof طولانییست و بهتر است آنرا با less صفحه بندی کنید.)
lsof
lsof | less
ستون های PID,COMMAND و USER به ترتیب معرف نام دستور، شناسه یا PID دستور و نام کاربری است که از آن فایل استفاده می کند. ستون Device به نام دیسک، ستون SIZE/OFF به اندازه فایل، ستون NODE به شماره inode (که تعیین کننده و هویت فایل در دسیک است) و ستون NAME معرف نام فایل است. از ستون های گفته می شود فهمید که کدام USER چه دستوری(فرایندی) را با چه PID ی را استفاده می کند و فرایند یا دستور در حال استفاده از کدام فایل، با چه اندازه ای و در کدام دیسک ذخیره شده است. و ستون دیگر FD و TYPE هستند که اطلاعات کاملتری را در اختیار شما قرار می دهند. ستون FD مخفف File Descriptor است.
ستون FD دارای مقادیر متفاوتی است. بطور مثال cwd که مخفف Current Work Directory است که دستور از انجا اجرا شده است. FD از نوع txt، فایل های کد یا فایل های باینری هستند. شکل زیر از صفحه Manual دستور lsof یعنی man lsof گرفته شده است که FD ها را معرفی می کند.
در ستون FD، برخی از مقادیر بصورت عددی باشند که به دنبال انها یکی از حروف زیر بیایند :
r : یعنی فایل در حالت Read-Only باز شده است.
w یعنی فایل در حالت write باز شده است.
u یعنی فایل در حالت read/write باز شده است.
هر برنامه یا دستوری در آغاز با اعداد 0 تا 2 باز می شود که می توانید از این پست مفهوم این سه عدد را بخوانید. البته برنامه ای می تواند از عددی دیگر مانند 4 یا 0 شروع شود ولی اعداد 0 تا 2 معنی خودشان را دارند.بسته به نوع سیستم عامل یونیکسی، ستون TYPE دارای مقادیری مانند REG,DIR است، عباراتی مانند CHR برای ابزار های کارکتری و BLK برای ابزار های بلاکی استفاده می شوند. عبارت FIFO مخفف First Input First Output و نوعی صف در سیستم عامل است.
استفاده از دستور lsof :
لیست کردن فرایند ها بر اساس فایل های باز شده : منظور این است که لیستی از فرایند ها داشته باشیم بر اساس یک فایل مشخص. مثال زیر فرایندهایی(دستورهایی) را که فایل syslog را باز کرده اند را نشان میدهد.
lsof /var/log/syslog
لیست کردن فایل های باز شده در زیر یک دایرکتوری : منظور این است که فایل های باز شده تحت یک دایرکتوری معین شده را فهرست کنیم. مثال زیر تمامی فایل های باز شده در زیر دایرکتوری var/log/ را فهرست می کند.
lsof +D /var/log
لیست کردن فایل های باز شده توسط یک فرایندهایی که با یک رشته مشخص، شروع می شوند : منظور این است که تمامی فایل های بازشده توسط فرایندهایی که نامش با یک رشته خاص آغاز می شوند را فهرست کنیم. برای اینکار از سوئیچ c- استفاده می کنیم. در مثال زیر تمام فایل های باز شده برای فرایند هایی که با رشته های ssh و init آغاز می شوند را فهرست میکند.
lsof -c ssh -c init
لیست کردن فایل های باز شده برای یک نقطه اتصال : منظور از نقطه اتصال یعنی اینکه یک پارتیشن مانند dev/sda3/را به یک دایرکتوری مانند home/ یا یک دایرکتوری مانند tmp/mountpoint/ وصل کنیم. این حالت مانند حالت فهرست کردن فایل های باز شده در زیر یک دایرکتوری است.
lsof /home
OR
lsof +D /home
لیست کردن فایل های باز شده برای یک کاربر خاص : منظور این است که تمامی فایل های باز شده توسط یک کاربر(USER) خاص را فهرست کنیم. اینکار توسط سوئیچ u- انجام می شود و بجای USERNAME نام کاربری دیلخواه را بنویسید.
lsof -u USERNAME
لیست کردن فایل های باز شده برای یک فرایند خاص : منظور این است که با PID فرایند، فهرست تمام فایل های باز شده توسط آن فرایند را ببینیم. اینکار توسط سوئیچ p- انجام می شود و بجای PID باید شناسه فرایند را جایگزین کنید.
lsof -p PID
اما برای بدست آوردن PID یک فرایند(دستو) می توانید از دستور ps بصورت زیر استفاده کنید. کافیست بجای CMD نان دستور یا سرویس یا فرایندی را که می خواهید PID آنرا بدست اورید بنویسید. خروجی عددی است که همان PID است که باید در دستور lsof -p PID جایگزین کنید.
ps aux | grep CMD