sammiepooh 0 Newbie Poster

Hello, I am fairly new to this site and am new at studying unix/linux OS. Recently I had an assignment involving finding a script that had run an administrative task such as checking file systems periodically. With it, I had to take each line and describe in my own terms what each line was doing. I am actually stumped at the moment and could use any guidance or reference in any direction as to how to proceed and successfully finish in defining each line of script.

For example, I know that the line outputing - PN=basename "$0" is stating that it assigns a value to the variable PN the tick marks, ', will execute a shell command, and in this statement, store the results in the variable named PN. The basename command is used to change a filename extension

I am not sure about the rest.

# checkfs - check file system periodically
#
# Author:       Heiner Steven <heiner.steven@odn.de>
# Category:     System Administration
# SCCS-Id.: @(#) checkfs    1.3 04/02/18


PN=`basename "$0"`

Mail=mail
[ -x /bin/mailx ] && Mail=/bin/mailx
Admin=heiner
Report="${TMPDIR:=/tmp}/checkfs.$$"

trap '
    [ -s "$Report" ] && $Mail -s "$PN report" $Admin < "$Report"
    rm -f "$Report"' 0
trap "exit 2" 1 2 3 13 15

NDirs=5

# Determine the operating system we run on
OS=
DF=
case `uname -s` in
    SunOS)
        case `uname -r` in
        4.*)
            OS=SUNOS
        DF=df
        DU=du
        ;;
        5.*)
            OS=SOLARIS
        DF="df -k"
        DU="du -k"
        ;;
    esac;;
    *)
        echo >&2 "unknown operating system, using default commands"
    DF=df
    DU=du
    OS=`uname -s | tr '[a-z]' '[A-Z]'`
    ;;
esac

exec > "$Report" 2>&1

[ $# -lt 1 ] && set -- /

#
# Find full file systems
#

MinPercent=95

echo "
*** File systems at least $MinPercent % full
"

$DF |
    nawk '
    {
        if ( Header "" == "" ) Header = $0
        for ( i=1; i<=NF; i++ ) {
            if ( $i ~ /^[0-9][0-9]*%$/ ) {
            Percent=$i; sub (/%$/, "", Percent)
            if ( Percent + 0 >= '$MinPercent' ) {
                if ( headerPrinted == "" ) {
                print Header; headerPrinted = "true"
            }
                print
            }
        }
        }
    }
    '

#
# Find the directories consuming most space, grouped by file system
#

echo "
*** Top $NDirs directories, grouped by file system
"

# Determine all file systems
Filesystems=

if [ -r /etc/fstab ]
then                    # BSD/SunOS/Linux style
    # Example:
    # /dev/sd0a  /  4.2 rw,quotas 1 1
    exec 3<&0 0</etc/fstab
    while read device mountpoint rest
    do
        case "$device" in
        /dev*)  ;;      # valid device name
        *)      continue;;
    esac
    case "$mountpoint" in
        /*)     ;;      # valid mount point
        *)      continue;
    esac
    Filesystems="$Filesystems $mountpoint"
    done
    exec 0<&3 3<&-
elif [ -r /etc/vfstab ]
then                    # SVR4 style (SOLARIS, UnixWare, ...)
    # Example:
    # /dev/dsk/c0t3d0s0 /dev/rdsk/c0t3d0s0 / ufs 1 no -

    exec 3<&0 0</etc/vfstab
    while read mountdev fsckdev mountpoint rest
    do
        case "$mountdev" in
        /dev*)  ;;      # o.k., valid device name
        *)      continue;;
    esac
    case "$mountpoint" in
        /*)     ;;      # valid path name
        *)      continue;;
    esac
    Filesystems="$Filesystems $mountpoint"
    done
    exec 0<&3 3<&-
fi

set -u

#Filesystems=

for FS in $Filesystems
do
    # Build list of files to exclude, i.e. "^/usr|^/var|^/usr/local"
    ExcludeList=
    for dir in $Filesystems
    do
        [ $dir = $FS ] && continue
    case "$FS" in
        $dir*)      # do not exclude this substring (i.e. "/")
        continue;;
    esac
    ExcludeList="${ExcludeList:+$ExcludeList|}$dir"
    done
    : ${ExcludeList:="THIS NEVER MATCHES A DIRECTORY"}
    ExcludeList="[  ]*($ExcludeList)"

    echo "
--- $FS"

    $DU $FS |
        egrep -v "$ExcludeList" |
    sort -nr |
    awk '$1 > 1000' |   # we are only interested in *large* directories
    head -$NDirs
done

echo "
*** Hidden directories
"
# Find all directories and files starting with a '.' and calculate the size
find "$@" \( -type d -o -type f \) -name '.*' -print |
    xargs $DU -s |
    awk '$1 > 1000'

# Find all files greater than 5 MB
#find "$@" -type f -size +5120 -print | xargs ls -ld
Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.