fsck מאולץ

דבר מוזר קרה לי השבוע… נגמר המקום באחת המחיצות בדיסק והחלטתי לפנות מקום ע"י העברת קובץ גדול (כ- 5 גיגה) למחיצה אחרת.

באמצע ההעתקה המחשב נתקע (אובונטו… 🙂 ), וניתן היה לאושש את המחשב רק ע"י אתחול פיזי. זה מה שביצעתי בפועל, אך לאחר האתחול הקובץ "נעלם" מבלי שהתפנה שטח מתאים במחיצה המקורית.

איך יוצאים מהתקלה המוזרה? מריצים fsck. ניתן להריץ את הפקודה מדיסק הצלה (אסור להריץ את הפקודה במערכת "חיה") וניתן להנחות את מערכת ההפעלה להריץ fsck בתהליך האתחול הבא (כך: sudo touch /forcefsck).

fsck פתר את הבעיה וכולי תקווה שאירוע כזה (במערכת ext4) לא יקרה יותר.

הערה: קראתי מאמר שניתן לכפות הרצת fsck (לאחר אתחול) ע"י הפקודה shutdown -rF now, אך הדגל F לא קיים, משום מה, באובונטו.

iotop

בחלונות לעיתים קרובות הדיסק הקשיח עובד קשה גם מבלי שמשתמש מסויים עובד על המחשב (או מריץ תוכנה כלשהי). יכולות להיות לכך הרבה סיבות: ריצה של האנטי וירוס, אנטי ספייוור, תוכנת אינדוקס (אם קיימת), תוכנת איחוי, תולעת, סוס טרויאני, וירוס ועוד…

בלינוקס הדיסק הקשיח בדר"כ שקט כשלא עובדים על המחשב. אם בכל זאת אתם מרגישים בפעילות כדאי להריץ את הפקודה iotop שתספק לכם מידע איזה תוכנה מעסיקה את הדיסק. בדר"כ תמצאו ש- updatedb רץ, אך בכל מקרה כדאי, מידי פעם, לבדוק מי מעסיק את הדיסק (למרות שזה נדיר בלינוקס עדיין צריך לבדוק שאין פעילות עויינת במחשב).

iotop_big

הערה: התוכנה לא מותקנת בברירת המחדל, אך ניתן להתקין אותה בעזרת מנהל החבילות.

שרשור פקודות ב- Bash

מספר דרכים לשרשור פקודות ב- Bash:

  1. הרצת סקריפט שמכיל את הפקודות אחת אחר השניה (כל פקודה בשורה נפרדת).
    – כל הפקודות ירוצו באותו ה- shell (גם אם הן מצליחות וגם אם לא)
  2. הרצת הפקודה: cmd1;cmd2;cmd3
    – הפקודות מופרדות ע"י ';' ורצות אחת אחר השניה
    – כל פקודה ממתינה לסיום הפקודה הקודמת כשכל פקודה רצה ב- shell אחר (קראו את התגובות)
  3. הרצת הפקודה: (cmd1;cmd2;cmd3)
    – כמו 2 רק שכל הפקודות רצות באותו ה- shell ברקע (קראו את התגובות)
  4. הרצת הפקודה: cmd1 && cmd2 && cmd3
    -בהתחלה תרוץ הפקודה cmd1, אם תצליח תרוץ הפקודה cmd2 ואם לא תצליח לא תורץ אף פקודה נוספת.
    – '&&' שונה מ- ';' בכך שבשימוש ב- ';' הפקודות תמיד רצות אחת אחר השנייה (ללא תלות בתוצאות ההרצה הקודמת)
  5. ניתן להשתמש בסקריפט ולבדוק אם כל פקודה הצליחה או לא
    – ניתן לדעת אם פקודה הצליחה או לא ע"י בדיקת הערך של '?$'. אם '?$' מחזיר 0 הפקודה הצליחה ואם מחזיר כל ערך אחר הפקודה נכשלה.
    – ניתן לבצע בדיקות נוספות ומתוחכמות יותר ע"י שימוש ב- || (שמשמעותו 'או') או ב-  && ('וגם')
  6. שימוש ב- & (הרצה ברקע): cmd1 & cmd2 & cmd3
    כל הפקודות ירוצו במקביל אך זאת שתסיים ראשונה תציג את הפלט ראשונה (אם יש פלט)

כמעט בטוח שיש דרכים נוספות ואשמח להתעדכן (גם בטעויות שרשמתי…).