สำนักวิทยบริการและเทคโนโลยีสารสนเทศ

Office of Academic Resources and Information Technology

ลบ File System ใน Linux แล้วคืนพื้นที่โดยไม่ต้อง Restart เครื่อง

ในกรณีเมื่อเราลบ filesystem ที่เป็น log file หรือ  file ใน /var/log ด้วยวิธีการ rm-rf /var/log/xxxx.log แล้วปรากฏว่าเมือ  show พื้นที่  df -lh พื้นที่ยังคงเหลือเท่าเดิม จำเป็นต้อง restart เครื่องใหม่เพื่อให้พื้นที่ว่างเพิ่มขึ้น   ที่เป็นแบบนี้เพราะว่าตอนที่ลบไฟล์ ในระบบยังมี process เปิดไฟล์ที่ลบอยู่ (ไฟล์ใน /var/log ส่วนมากจะถูกเปิดโดย process ชื่อ syslog อยู่ตลอดเวลา)
ถ้าคุณใช้คำสั่ง  lsof /var/log  หลังจากที่ลบไฟล์ไปแล้วจะเห็นไฟล์"[deleted]" ถูกเปิดใช้อยู่โดยแต่ละ process  
root@scitech2:/var/log# lsof  | grep /var/log/
rsyslogd   1187        root    1w      REG      104,6   1653341     143588 /var/log/kern.log
rsyslogd   1187        root    2w      REG      104,6  32213758     143602 /var/log/messages
rsyslogd   1187        root    5w      REG      104,6 170726327     143471 /var/log/syslog (deleted)
rsyslogd   1187        root    6w      REG      104,6    440270     143598 /var/log/debug
rsyslogd   1187        root    7w      REG      104,6   1538753     143599 /var/log/auth.log
rsyslogd   1187        root    8w      REG      104,6 159269911     143597 /var/log/daemon.log (deleted)
rsyslogd   1187        root    9w      REG      104,6   3493820     143551 /var/log/user.log
memcached  1279      nobody    1w      REG      104,6         0     143827 /var/log/memcached.log
apache2   30126        root    2w      REG      104,6  19902956     143572 /var/log/apache2/error.log
apache2   30126        root    8w      REG      104,6         0     143478 /var/log/apache2/other_vhosts_access.log
apache2   30131    www-data    2w      REG      104,6  19902956     143572 /var/log/apache2/error.log
 
พื้นที่จะกลับคืนมาก็ต่อเมื่อ process ทั้่งหมดที่เปิดไฟล์นั้นอยู่ได้ปิดไฟล์นั้นไปแล้วเท่านั้น(หรือprocessทุกอันที่เปิดไฟล์อยู่ได้ exit หมดแล้ว) ก่อนจะลบไฟล์จึงควรที่จะเช็คดูก่อนว่ามี process ไหนใช้ไฟล์นั้นอยู่หรือเปล่า คำสั่งที่ใช้เช็คก็ fuser แต่ถ้าลบไฟล์ไปแล้วก็ต้อง kill process พวกนั้นทั้งหมด ในที่นี้ file /var/log/syslog ถูกใช้โดย process rsyslogd ก็ต้อง restart service rsyslogd โดย
rabbit:~#/etc/init.d/rsyslogd restart
( ที่คุณเห็นพื้นที่ว่างคืนมาหลังการ restart เครื่องก็เพราะตอนที่ restart เครื่อง process ทั้งหมดถูกปิดลงไปแล้ว )
จากนั้นให้ลองใช้ คำสั่ง df -lh ดูพื้นที่อีกครั้ง
ถ้าต้องการ clearไฟล์พวกนี้แนะนำว่าให้ใช้วิธี cat /dev/null > filename จะดีกว่า ไฟล์เดิมจะไม่ถูกลบแต่ข้อมูลทั้งหมดในไฟล์จะถูกล้างออกทำให้ได้ที่ว่างคืนมาทันทีโดยไม่ต้อง restart process
 
ที่มา [online]url : http://www.thaiadmin.org/board/index.php?topic=154427.0;imode