كمستخدمي Linux، غالبًا ما نعمل مع العمليات الخلفية لفترات طويلة على Linux، التي تُسمى الشياطين أو الخدمات. بعض الأمثلة الشائعة على الخدمات هي Secure Shell (sshd)، ومدير الشبكة (networkd)، ومدير الحجم (LVM)، Cron، والقائمة تطول.
في كثير من الأحيان نحتاج إلى مراقبة سجلات هذه الخدمات لتصحيح مشاكل النظام. ومع ذلك، أحد التحديات الرئيسية هي أن هذه الخدمات تولد الكثير من السجلات وفي معظم الأوقات يجعل الانتقال من خلال هذه السجلات أمرًا مزعجًا، وهنا يمكننا استخدام أمر tail.
أمر tail هو أداة سطر الأوامر، مشابهة لأمر head التي تقرأ ملفًا وتطبع أخر 10 أسطر (المحتوى) من ملف واحد أو أكثر إلى الإخراج القياسي.
في هذا الدليل التطبيقي، سنتعلم حول أمر tail. بحلول نهاية هذا الدليل، سيكون مستخدمو سطر الأوامر في Linux قادرين على استخدام أمر tail بفعالية.
محتويات الجدول
صيغة أمر الأذيل
صيغة أمر الأذيل مماثلة لـ أوامر Linux الأخرى:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. طباعة آخر 10 أسطر من الملف في Linux
بشكل افتراضي، يقوم أمر الأذيل بطباعة آخر 10 أسطر من الملف المحدد كما هو موضح.
$ tail /var/log/secure Apr 2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774 Apr 2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint Apr 2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2 Apr 2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user Apr 2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378 Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
هنا، يمكننا رؤية أن الأمر أعلاه يعرض آخر عشرة أسطر من ملف /var/log/secure.
2. طباعة آخر N أسطر من الملف في Linux
في المثال السابق، يقوم الأمر بطباعة آخر 10 أسطر من الملف المحدد. ومع ذلك، يمكننا استخدام الخيار -n
الذي يسمح لنا بتحديد عدد الأسطر التي يتم طباعتها على الشاشة كما هو موضح.
$ tail -n 3 /var/log/secure Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
في هذا المثال، يمكننا أن نرى أن الأمر الآن يعرض ثلاثة أسطر فقط بدلاً من العشرة.
3. تجاهل أول N أسطر من الملف في Linux
هنا، يمكننا استخدام رمز الزائد (+) مع الخيار -n، الذي يسمح لنا بالتحكم في نقطة البداية من الملف المعطى.
لفهم ذلك، دعنا نستخدم القيمة +5 لبدء الإخراج من السطر الخامس:
$ tail -n +5 /var/log/secure Apr 2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774 Apr 2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint Apr 2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2 Apr 2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0) Apr 2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user Apr 2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378 Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
4. عرض آخر N أحرف من الملف
بشكل مماثل للأسطر، يمكننا أيضًا استخدام الأمر لعرض آخر N أحرف من الملف باستخدام الخيار -c كما هو موضح أدناه:
$ tail -c 7 /var/log/secure (uid=0)
في هذا المثال، يمكننا رؤية أن الأمر يظهر آخر سبعة أحرف ASCII من الملف المعطى.
5. إزالة أول N أحرف من الملف
بالمثل، يمكننا استخدام رمز الزائد (+) مع الخيار -c لتخطي الحرف الأول N. لذلك دعنا نتخطى السطر الأول من الملف باستخدام الأمر أدناه:
$ tail -c +5 /var/log/secure Apr 2 03:02:59 TecMint sudo[162801]: root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/bin/dnf install R Apr 2 03:02:59 TecMint sudo[162801]: pam_unix(sudo:session): session opened for user root(uid=0) by root(uid=0) Apr 2 03:03:02 TecMint sudo[162801]: pam_unix(sudo:session): session closed for user root Apr 2 03:11:17 TecMint groupadd[163602]: group added to /etc/group: name=avahi, GID=70 Apr 2 03:11:18 TecMint groupadd[163602]: group added to /etc/gshadow: name=avahi Apr 2 03:11:18 TecMint groupadd[163602]: new group: name=avahi, GID=70 Apr 2 03:11:19 TecMint useradd[163610]: new user: name=avahi, UID=70, GID=70, home=/var/run/avahi-daemon, shell=/sbin/nologin, from=none Apr 2 03:13:41 TecMint groupadd[163704]: group added to /etc/group: name=colord, GID=986 Apr 2 03:13:41 TecMint groupadd[163704]: group added to /etc/gshadow: name=colord
هنا، يمكننا رؤية أن الأمر يظهر جميع الأسطر باستثناء السطر الأول.
6. عرض اسم الملف في العنوان
يمكننا أن نوجه الأمر tail لعرض اسم الملف الحالي كعنوان عرض، وهو أمر مفيد أثناء العمل مع ملفات متعددة.
لذا، دعنا نستخدم الخيار -v لتمكين عرض العنوان:
$ tail -n 3 -v /var/log/secure ==>/var/log/secure <== Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
==> /var/log/secure <==
يمثل رأس العرض.
7. عرض اسم الملف كرأس في ملفات متعددة
مثل أي أمر آخر لمعالجة الملفات، يمكننا أيضًا استخدام ملفات متعددة مع أمر tail. في مثل هذه الحالات، يتم استخدام رأس العرض لفصل محتويات الملف.
$ tail -n 3 -v /var/log/secure /var/log/secure-20230402 ==> /var/log/secure <== Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0) ==> /var/log/secure-20230402 <== Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987 Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2 Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
في الإخراج أعلاه، يمكننا رؤية رأس العرض لكل ملف.
8. كيفية تعطيل رأس العرض في الملف
في المثال السابق، رأينا أن الأمر يمكن أن يمكّن رأس العرض أثناء العمل مع ملفات متعددة. ومع ذلك، يمكننا كبح هذا السلوك الافتراضي باستخدام الخيار -q
.
$ tail -q -n 3 /var/log/secure /var/log/secure-20230402 Apr 2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint Apr 2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2 Apr 2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0) Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987 Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2 Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
هنا، يمكننا رؤية أن الأمر يعرض محتويات الملف واحدة تلو الأخرى بدون أي رأس عرض.
9. كيفية مراقبة ملف للتغييرات
حتى الآن رأينا أن أمر tail يخرج بمجرد معالجة عدد السطور أو الحروف المطلوبة. ومع ذلك، في بعض الأحيان نريد عرض السجلات المولدة حديثًا أيضًا.
في مثل هذه الحالات، يمكننا استخدام الخيار -f
مع الأمر، الذي يسمح لنا بمراقبة الملف للتغييرات في الوقت الفعلي.
لفهم هذا، دعنا ننفذ أولاً الأمر أدناه في الطرفية الأولى:
$ tail -f /var/log/messages Apr 2 15:13:28 TecMint NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint' Apr 2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service... Apr 2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service. Apr 2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted Apr 2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully. Apr 2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Starting dnf makecache... Apr 2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently. Apr 2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Finished dnf makecache.
هنا، يمكننا رؤية أن الأمر ينتظر بلا نهاية بعد عرض آخر عشرة أسطر:
الآن، دعنا نفتح محطة أخرى ونضيف بعض النص إلى ملف numbers-2.txt:
$ echo "View Logs in Real-Time" >> /var/log/messages
الآن، دعنا ننتقل إلى المحطة الأولى لعرض النص الذي تمت إضافته حديثًا:
$ tail -f /var/log/messages Apr 2 15:13:28 TecMint NetworkManager[741]: [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint' Apr 2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service... Apr 2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service. Apr 2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted Apr 2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully. Apr 2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Starting dnf makecache... Apr 2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently. Apr 2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully. Apr 2 15:18:03 TecMint systemd[1]: Finished dnf makecache. View Logs in Real-Time
هنا، يمكننا رؤية أن أمر الذيل يعرض النص الذي تمت إضافته حديثًا.
هل تعرف أي مثال آخر جيد لأمر الذيل في نظام التشغيل لينكس؟ دعنا نعرف آرائك في التعليقات أدناه.