文件处理技巧

1、文件锁定:

     在工业应用中,有些来自于工业设备的文件将会被放到指定的目录下,由于这些文件需要再被重新格式化后才能被更高层的软件进行处理。而此时负责处理的脚本程序极有可能是多个实例同时运行,因此这些实例之间就需要一定的同步,以避免多个实例同时操作一个文件而造成的数据不匹配等问题的发生。文件锁定命令可以帮助我们实现这一同步逻辑。
 /> cat > test26.sh
     #!/bin/sh
     #1. 这里需要先确认flock命令是否存在。
     if [ -z $(which flock) ]; then
         echo "flock doesn't exist."
         exit 1
     fi
     #2. flock中的-e选项表示对该文件加排它锁,-w选项表示如果此时文件正在被加锁,当前的flock命令将等待20秒,如果能锁住该文件,就继续执行,否则退出该命令。
     #3. 这里锁定的文件是/var/lock/lockfile1,-c选项表示,如果成功锁定,则指定其后用双引号括起的命令,如果是多个命令,可以用分号分隔。
     #4. 可以在两个终端同时启动该脚本,然后观察脚本的输出,以及lockfile1文件的内容。
     flock -e -w 20 /var/lock/lockfile1 -c "sleep 10;echo `date` | cat >> /var/lock/lockfile1"
     if [ $? -ne 0 ]; then
         echo "Fail."
         exit 1
     else
         echo "Success."
         exit 0
     fi
     CTRL+D

2、用小文件覆盖整个磁盘:

     假设我们现在遇到这样一个问题,公司的关键资料copy到测试服务器上了,在直接将其删除后,仍然担心服务器供应商可以将其恢复,即便是通过fdisk进行重新格式化,也仍然存在被恢复的风险,鉴于此,我们需要编写一个脚本,创建很多小文件(5MB左右),之后不停在关键资料所在的磁盘中复制该文件,以使Linux的inode无法再被重新恢复,为了达到这里效果,我们需要先构造该文件,如:
    /> find . -name "*" > testfile
     /> ls -l testfile
     -rwxr-xr-x. 1 root root 5123678 Dec  9 11:46 testfile
     /> cat > test27.sh
     #!/bin/sh
     #1. 初始化计数器变量,其中max的值是根据当前需要填充的磁盘空间和testfile的大小计算出来的。
     counter=0
     max=2000000
     remainder=0
     #2. 每次迭代counter变量都自增一,以保证每次生成不同的文件。当该值大于最大值时退出。
     #3. 对计数器变量counter按1000取模,这样可以在每生成1000个文件时打印一次输出,以便看到覆盖的进度,输出时间则便于预估还需要多少时间可以完成。
     #4. 创建单独的、用于存放这些覆盖文件的目录。
     #5. 生成临时文件,如果写入失败打印出提示信息。
     while true
     do
         ((counter=counter+1))
         if [ #counter -ge $max ]; then
             break
         fi
         ((remainder=counter%1000))
         if [ $remainder -eq 0 ]; then
             echo -e "counter = $counter\t date = " $(date)
         fi
         mkdir -p /home/temp2
         cat < testfile > "/home/temp/myfiles.$counter"
         if [[ $? -ne 0 ]]; then
             echo "Failed to wrtie file."
             exit 1
         fi
     done
     echo "Done"
     CTRL+D
     /> ./test27.sh
     counter = 1000        Fri Dec  9 17:25:04 CST 2011
     counter = 2000        Fri Dec  9 17:25:24 CST 2011
     counter = 3000        Fri Dec  9 17:25:54 CST 2011
     ... ...
     与此同时,可以通过执行下面的命令监控磁盘空间的使用率。
/> watch -n 2 'df -h'
     Every 2.0s: df -h                                       Fri Dec  9 17:31:56 2011

     Filesystem            Size   Used Avail Use% Mounted on
     /dev/sda2             3.9G  2.3G  1.4G  63% /
     tmpfs                  504M  100K  504M   1% /dev/shm
     /dev/sda1              49M   36M   11M  77% /boot
     /dev/sda3              15G  172M   14G   2% /home
     我们也可以在执行的过程中通过pidstat命令监控脚本进程的每秒读写块数。    

3、统计当前系统中不同运行状态的进程数量:

     在Linux系统中,进程的运行状态主要分为四种:运行时、睡眠、停止和僵尸。下面的脚本将统计当前系统中,各种运行状态的进程数量。
/> cat > test28.sh
     #!/bin/sh
     #1. 初始化计数器变量,分别对应于运行时、睡眠、停止和僵尸。
     running=0
     sleeping=0
     stopped=0
     zombie=0
     #2. 在/proc目录下,包含很多以数字作为目录名的子目录,其含义为,每个数字对应于一个当前正在运行进程的pid,该子目录下包含一些文件用于描述与该pid进程相关的信息。如1表示init进程的pid。那么其子目录下的stat文件将包含和该进程运行状态相关的信息。
     #3. cat /proc/1/stat,通过该方式可以查看init进程的运行状态,同时也可以了解该文件的格式,其中第三个字段为进程的运行状态字段。
     #4. 通过let表达式累加各个计数器。
     for pid in /proc/[1-9]*
     do
         ((procs=procs+1))
         stat=`awk '{print $3}' $pid/stat`
         case $stat in
             R) ((running=runing+1));;
             S) ((sleeping=sleeping+1));;
             T) ((stopped=stopped+1));;
             Z) ((zombie=zombie+1));
         esac
     done
     echo -n "Process Count: "
     echo -e "Running = $running\tSleeping = $sleeping\tStopped = $stopped\tZombie = $zombie."
     CTRL+D
     /> ./test28.sh
     Process Count: Running = 0      Sleeping = 136  Stopped = 0     Zombie = 0.

你可能感兴趣的:(文件锁定,覆盖磁盘)