Κλείσιμο του dhclient

Giorgos Keramidas keramida at ceid.upatras.gr
Thu May 29 11:29:45 EEST 2008


On Thu, 29 May 2008 10:33:03 +0300, George Notaras <gnot at g-loaded.eu> wrote:
> George Notaras wrote:
>> George Notaras wrote:
>>
>>> To πρόβλημά μου έιναι ότι δεν έχω βρει κάποιον μη-brutal τρόπο να
>>> κλείσω το process dhclient ή να το κάνω να αναλάβει την IP του br0
>>> και να αφήσει ήσυχο το eth0. Το man page δεν βοήθησε.
>>
>> Δεν βλέπω κάποιον άλλον τρόπο εκτός από kill. Οπότε κάνω τη δουλειά
>> μου με το παρακάτω:
>>
>> #!/usr/bin/env bash
> [...]
>
>
> arrrg#@!&... επειδή γαμ....ε με τα tabs, το ξαναστέλνω:

Δεν το γράφεις και λίγο «καλύτερα» μιας και ασχολείσαι μαζί του;

: #!/usr/bin/env bash
:
: progname=$(basename "$0")
:
: if [ $# -ne 1 ]; then
:         echo "usage: ${progname} <interface>" >&2
:         exit 1
: fi
:
: ifname="$1"
: pidlist=$( ps axwww | fgrep -v grep | grep "${dhclient}.*${ifname}" |
:     awk '{print $1}' )
:
: if [ -z "${pidlist}" ]; then
:         exit 0                  # Nothing to do, just exit.
: fi
:
: for pid in ${pidlist} ; do
:         kill -TERM "${pid}"
:         if [ $? -ne 0 ]; then
:                 # Cannot kill this process, try the next one.
:                 echo "${progname}: kill ${pid}: cannot TERM process." >&2
:                 continue
:         fi
:         echo "SIGTERM sent to pid ${pid}"
:         ps xauww | fgrep -v grep | grep -q "${pid}.*${dhclient}.*${ifname}"
:         if [ $? -eq 0 ]; then
:                 # Wait a bit for the running dhclient process to exit.
:                 sleep 3
:         fi
:         kill -9 "${pid}"
:         if [ $? -ne 0 ]; then
:                 echo "${progname}: kill ${pid}: cannot KILL process." >&2
:         else
:                 echo "SIGKILL sent to pid ${pid}"
:         fi
:
:         # Try to delete any stale pidfile too.
:         grep -l "\\<${pid}\\>" /var/run/dhclient*.pid | \
:         while read pidfile ; do
:                 stalepid=$( awk '{print $1}' "${pidfile}" 2> /dev/null )
:                 if [ $? -ne 0 ] || [ -z "${stalepid}" ]; then
:                         echo "${progname}: error: cannot read PID from" \
:                             "pidfile at ${pidfile}"
:                         continue
:                 fi
:                 if [ ${stalepid} -eq ${pid} ]; then
:                         rm "${pidfile}" && \
:                         echo "${progname}: deleted PID file ${pidfile}" \
:                             "for process ${stalepid}"
:                 fi
:         done
: done

Δεν είναι προφανές γιατί έκανα κάποιες από τις αλλαγές, αλλά το παρακάτω
ίσως βοηθήσει :)

> if [ -n "$DHCLIENT_PROC" ] ; then

Το ανάποδο σε γλιτώνει από ένα nesting level.  Αντί για:

        if [ blah ]; then
                if [ foo ]; then
                        if [ baz ]; then
                                if [ bar ]; then
                                        # Not enough space for code!
                                fi
                        fi
                fi
        fi

Είναι μερικές φορές πιο ευανάγνωστο το:

        if [ not-blah ]; then
                exit 0
        fi
        if [ not-foo ]; then
                exit 0
        fi

Βλέποντας αυτό είναι προφανές ότι μπορεί να γραφτεί με το πιο «ωραίο»
στυλ:

        if [ not-blah ] || [ not-foo ] || [ not-baz ] || [ not-bar ]; then
                exit 0
        fi

Μόλις γλίτωσες τουλάχιστον 4 nesting levels και κάμποσο χώρο :)

>     for DHCLIENT in $DHCLIENT_PROC; do
>         echo "** Found dhclient process: $DHCLIENT"
>         /bin/kill $DHCLIENT
>         echo "Killed dhclient process: $DHCLIENT"

Δεν ξέρεις αν έκανες kill το process, μέχρι να ελέγξεις το $?.

        /bin/kill ${DHCLIENT}
        if [ $? -ne 0 ]; then
                # Can't kill this process, skip it.
                continue
        fi

>         # Also delete the relevant PID file
>         for pidfile in /var/run/dhclient*.pid ; do
>             if [ "$(cat $pidfile)" = "$DHCLIENT" ] ; then
>                 rm -f "$pidfile"
>                 echo "Deleted PID file '$pidfile' for process $DHCLIENT"
>             fi
>         done
>     done

Μπορείς να «μικρύνεις» λίγο τη λίστα των files που θα διαπεράσεις με
shell contructs, χρησιμοποιώντας το -l option της grep:

        grep -l "\\<${pid}\\>" /var/run/dhclient*.pid | \
        while read fname ; do
                # Do something with filename ${fname}
        done

Αν το `/var/run/dhclient*.pid' δεν κάνει match με *κανένα* file, τότε το
${pidfile} θα έχει τουλάχιστον μια τιμή.  Το unexpanded pattern:

        $ for fname in no-such-*pattern ; do echo "${fname}" ; done
        no-such-*pattern
        $

Οπότε ίσως έχει νόημα να ελέγχεις ότι η cat(1) απέτυχε, ή έστω να κάνεις
redirect το stderr της sto /dev/null:

        if [ "$(cat $pidfile 2>/dev/null)" = "${DHCLIENT}" ]; then
                ...

Μετά από όλα αυτά δεν είναι πλέον `quick hack' όμως, αλλά σχεδόν θέλει
manpage :)




More information about the Linux-greek-users mailing list