כמשתמשי Linux, אנו עובדים לעתים קרובות עם תהליכי רקע ב-Linux ארוכי טווח, הנקראים גם דמונים או שירותים. כמה מדוגמי השירותים הנפוצים הם Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron, והרשימה ממשיכה.
לעיתים קרובות אנו צריכים ל עקוב אחר הלוגים של אלה השירותים כדי לאתר בעיות במערכת. אחת האתגרים העיקריים הוא שהשירותים הללו יוצרים המון לוגים ורוב הזמן העברת דרך די קשה, וזהו המקום בו אנו יכולים להשתמש ב פקודת tail.
פקודת tail היא כלי שורת פקודה, דומה ל פקודת head שקוראת קובץ ומדפיסה את השורות האחרונות (התוכן) של אחד או יותר קבצים לפלט סטנדרטי.
במדריך המעשי הזה, נלמד על פקודת tail. עד סוף המדריך הזה, משתמשי קו הפקודה ב-Linux יוכלו להשתמש בפקודת tail ביעילות.
תוכן עניינים
תחביר פקודת tail
התחביר של פקודת tail דומה ל־פקודות אחרות ב־Linux:
$ tail [OPTIONS] [FILE-1] [FILE-2] ...
1. הדפסת השורות האחרונות בקובץ ב־Linux
כברירת מחדל, פקודת tail מדפיסה את ה־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)
בדוגמה זו, אנו רואים שהפקודה מציגה את שבעת התווים האחרונים של הקובץ הנתון.
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
כאן, ניתן לראות כי הפקודה tail מציגה את הטקסט שהתווסף לאחרונה.
האם אתה מכיר דוגמה אחרת משובץ הפקודה tail בלינוקס? תספר לנו את דעתך בתגובות למטה.