SUSE LINUX Enterprise & openSUSE Community
มิถุนายน 25, 2019, 05:20:12 PM *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
ข่าว:
 
   หน้าแรก   ช่วยเหลือ ค้นหา เข้าสู่ระบบ สมัครสมาชิก  

[Why we need your support] SUSE and openSUSE are trademarks of Attachmate Group, Inc. - WE ARE NOT IN ANY WAY ASSOCIATED WITH SUSE AND ATTACHMATE GROUP. SUSEThailand.com is a SUSE Linux user and community found in Thailand but not limited to other country suse linux user to join in. Currently active contents (How to's, Scripts, Tips, Tricks, Tutorials, Linux Command Line, and Troubleshooting) this suse linux how to's and expert support are SUSE Linux.
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน
หัวข้อ: Trash Policy และสคริปต์สำหรับลบ Trash folder  (อ่าน 1914 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
Sontaya
Administrator
Expert : ผู้เชี่ยวชาญ
*****

Karma: +1/-0
ออฟไลน์ ออฟไลน์

กระทู้: 1931


Administrator


เว็บไซต์
« เมื่อ: พฤศจิกายน 05, 2012, 12:19:23 PM »


Trash Policy และสคริปต์สำหรับลบ Trash folder

เหตุผลหนึ่งที่ทำให้ user over quota นั้นก็คือผู้ใช้ไม่ลบข้อมูลในถังขยะ (Empty) บน GUI GNOME เมื่อผู้ใช้ลบไฟล์หรือไดร์เรกทอรีใดๆ ไฟล์ที่ถูกลบจะถูกย้ายไปที่ถังขยะก่อน (Trash) ซึ่ง home directory ของผู้ใช้พื้นที่จะร่วม Trash ด้วย ดังนั้นผู้ใช้ต้องทำการลบไฟล์ที่อยู่ในถังขยะก่อน ขนาดพื้นที่ถึงจะเพิ่มขึ้นมา แต่ปัญหาอยู่ที่ว่าผู้ใช้ไม่ลบไฟล์ใน trash จึงเป็นที่มาว่าทำไมเราถึงต้องมี  Trash Policy ขึ้นมา  ตัวอย่างด้านล่างนี้จะเป็นสคริปต์สำหรับตั้งเวลาลบไฟล์ในถังขยะของผู้ใช้ทุกๆ คน

บน GNOME 2.22+
$HOME/.local/share/Trash/files  ที่เก็บไฟล์ที่ถูกลบ
$HOME/.local/share/Trash/info   จะเก็บรายละเอียดของไฟล์ที่ถูกลบ (trash info) เช่น พาทเก็บไฟล์, วัน/เวลาที่ลบไฟล์

ตัวอย่างการกำหนด Trash Policy เพื่อใช้งาน

1. ตั้งเวลาอัตโนมัติในการลบไฟล์ในถังขยะ (Basic)


เช่น ให้ลบไฟล์ในถังขยะทุกวันที่ 15 ในเวลาเที่ยงคืน โดย Empty Trash จาก CronJob

โค๊ด:
crontab -e

0 0 15 * * rm -rf ~/.local/share/Trash/files/*
0 0 15 * * rm -rf ~/.local/share/Trash/info/*

หรือจะเขียนเป็นสคริปต์ก็ได้เช่นกัน

โค๊ด:
#!/bin/bash
###
UHOME="/home"
DPHAT_FILES="/.local/share/Trash/files"
DPHAT_INFO="/.local/share/Trash/info"
FILE="/*"
USERS=$(getent passwd | awk -F: '$3>1000 {print $1}') # get list of all users
for u in $USERS
do
   /bin/rm -rf ${UHOME}/${u}$DPHAT_FILES$FILE
   /bin/rm -rf ${UHOME}/${u}$DPHAT_INFO$FILE
done
exit 0;
###


วิธีนี้ง่าย แต่ปัญหาคือ กรณีผู้ใช้ลบไฟล์ในวันที่ 14 ไฟล์นั้นจะถูกย้ายไปที่ไดร์เรกทอรี Trash พอวันที่ 15 ไฟล์ที่อยู่ในถังขยะจะถูกลบโดยอัตโนมัติ ดังนั้นวิธีนี้จึงอาจไม่เหมาะ (เมื่อวานยังอยุ่ในถังขยะ ทำไมวันนี้ไม่มีแล้วค่ะ? พอดีแม่บ้านทำความสะอาดตอนเที่ยงคืน ! (กรณีไม่ประกาศ Trash Policy ก็เตรียมตัวกู้คืนจาก backup ให้ผู้ใช้ได้เลยครับ)


2. ตั้งเวลาอัตโนมัติในการลบไฟล์ โดยตรวจสอบวันเวลาของไฟล์ (Advance)

เช่น ลบไฟล์หลังจาก nn days (-mtime หรือเวลา modify)

ตัวอย่างสคริป ลบไฟล์เก่ากว่าสองวัน หรือ 48 ชั่วโมง

โค๊ด:
#!/bin/bash
###
find ~/.local/share/Trash/info* -mtime +2 -exec rm {} \;
find ~/.local/share/Trash/files* -mtime +2 -exec rm {} \;
###


2.1 สคริปต์แบบให้ลบทุกๆ ผู้ใช้ (Loop script) ทำงานตาม contrab ที่ตั้งไว้


โค๊ด:
#!/bin/bash
#-------------------------------------------------------------------------------
UHOME="/home"
DPHAT_FILES="/.local/share/Trash/files"
DPHAT_INFO="/.local/share/Trash/info"
FILE="/*"
USERS=$(getent passwd | awk -F: '$3>1000 {print $1}') # get list of all users
for u in $USERS
do
#EmptyTrash
   /usr/bin/find ${UHOME}/${u}$DPHAT_FILES$FILE -mtime +30 -exec rm -rf {} \;
#EmptyInfo
   /usr/bin/find ${UHOME}/${u}$DPHAT_INFO$FILE -mtime +30 -exec rm -rf {} \;
done
exit 0;
#-------------------------------------------------------------------------------


NOTE: Date/Time จากคำสั่ง ls -al จะแสดงเวลาที่แก้ไขไฟล์ (Modify) ไฟล์ที่อยู่ในไดร์เรกทอรี /file และ /info วันเวลาของไฟล์จะแตกต่างกัน ใน /file จะเป็นวันเวลาที่ไฟล์ถูกสร้าง เช่น 2011-10-07 10:10 แต่ใน /info จะเป็นวันเวลาที่ไฟล์ถูกลบ เช่น 2012-09-12 14:50 เป็น

สคริปต์ด้านบนไม่ได้ตรวจสอบจากวันเวลาที่ลบไฟล์ แต่ตรวจสอบว่าไฟล์ไหนเก่ากว่า 1 เดือน ให้ลบทิ้งเท่านั้น จะให้ดีต้องเขียนสคริปต์ให้ list files จาก /info ให้ match กับ /files ถึงจะสมบูรณ์และถูกต้องครับ


ตัวอย่างสคริปต์ ไม่ลบไฟล์ที่เก่าน้อยกว่า 15 วัน (ไฟล์ที่พึ่งลบในระยะเวลา 15 วันจะไม่ถูกลบ)

โค๊ด:
#/bin/bash
# never delete files less than 15 days old
###------------------------------------------------------------------------------
TRASH_DAYS=15
UHOME="/home"
TrashPath=/.local/share/Trash
USERS=$(getent passwd | awk -F: '$3>1000 {print $1}') # get list of all users
for u in $USERS
do
find ${UHOME}/${u}"$TrashPath/info" -maxdepth 1 -type f -ctime +$TRASH_DAYS -execdir ls '{}' + |sed -e 's/.\///' |sed -e 's/.trashinfo$//' > /tmp/emptytrash_trashinfo.list
    while read line
    do
      ls "$TrashPath/files/${line}" > /dev/null 2>&1
      if [ $? -ne 0 ]
      then
        rm -rf ${UHOME}/${u}"$TrashPath/info/${line}.trashinfo"
      fi
    done < /tmp/emptytrash_trashinfo.list
    rm -rf /tmp/emptytrash_trashinfo.list
###------------------------------------------------------------------------------


2.2 สคริปต์แบบ Startup Applications (ทำงานเมื่อผู้ใช้ Login เข้าสู่ระบบ)

โค๊ด:
vi /etc/X11/xinit/xinitrc.d/emptytrash.sh

โค๊ด:
#/bin/bash
###------------------------------------------------------------------------------
# Path to Trash directory

TrashPath=~/.local/share/Trash
# never delete files less than 15 days old
FileTime=15
DirTime=15
InfoTime=15

find "$TrashPath/files" -maxdepth 1 -type f -ctime +$FileTime -execdir rm -f '{}' +
find "$TrashPath/files" -maxdepth 1 -type d -ctime +$DirTime -execdir rm -rf '{}' +
find "$TrashPath/info" -maxdepth 1 -type f -ctime +$InfoTime -execdir ls '{}' + |sed -e 's/.\///' |sed -e 's/.trashinfo$//' > /tmp/emptytrash_trashinfo.list
    while read line
    do
      ls "$TrashPath/files/${line}" > /dev/null 2>&1
      if [ $? -ne 0 ]
      then
        rm -rf "$TrashPath/info/${line}.trashinfo"
      fi
    done < /tmp/emptytrash_trashinfo.list
    rm -rf /tmp/emptytrash_trashinfo.list
###------------------------------------------------------------------------------

สร้างไฟล์ shortcut ที่ไดร์เรกทอรีด้านล่างนี้

/etc/xdg/autostart และ /usr/share/gnome/autostart

โค๊ด:
vi /etc/xdg/autostart/emptytrash.desktop

โค๊ด:
[Desktop Entry]
Type=Application
Exec=/bin/sh /etc/X11/xinit/xinitrc.d/emptytrash.sh
Hidden=false
X-GNOME-Autostart-enabled=true
Name[en_US]=Empty Trash
Name=emptytrash
Comment[en_US]=Automatically trash folder
Comment=Empty Trash Script

โค๊ด:
cp emptytrash.desktop /etc/xdg/autostart/

โค๊ด:
cp emptytrash.desktop /usr/share/gnome/autostart/


คำสั่ง find และออปชันในการค้นหา
http://www.susethailand.com/suseforum/index.php?topic=517.0

Script reference - http://ubuntuforums.org/showthread.php?t=698649&highlight=trash
แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า

ageLOC Technology
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป:  

(@)2007 SUSE Linux user community found in Thailand. This site is not an official openSUSE and SUSE website, and is not in any way affiliated with or endorsed by SUSE Linux GmbH or Novell. openSUSE and SUSE are trademarks of Novell, Inc. in the United States and other countries.
Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!
หน้านี้ถูกสร้างขึ้นภายในเวลา 0.028 วินาที กับ 19 คำสั่ง (Pretty URLs adds 0.006s, 2q)