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

George Notaras gnot at g-loaded.eu
Thu May 29 13:15:22 EEST 2008


Giorgos Keramidas wrote:
> 
> Δεν το γράφεις και λίγο «καλύτερα» μιας και ασχολείσαι μαζί του;
> 
> : #!/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
> 
> Δεν είναι προφανές γιατί έκανα κάποιες από τις αλλαγές, αλλά το παρακάτω
> ίσως βοηθήσει :)

Εντάξει, αυτό είναι για Champions League :) Respect!

Εκείνο που είχα γράψει ήταν σιχαμερό! :P


>> 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 και κάμποσο χώρο :)

Αυτό είναι αλήθεια. Αλλά, όταν κάποιος μάθει κάτι στραβά από την αρχή...
Aυτή τη λογική, δηλαδή να μην ξεκινάω μια σειρά από 'if clauses' 
αρνητικά, την είχα κολλήσει από πολύ παλιά και ... μου βγαίνει από μόνη 
της. Στην πραγματικότητα είναι έτσι όπως τα γράφεις. Βολεύει πιο πολύ 
και είναι πιο λογικό.
Thanks :)


>>     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
>                 ...

Αυτά δεν τα ήξερα, αλλά φαίνονται πολύ χρήσιμα και θα τα ψάξω κάποια 
στιγμή. Εκτιμώ πολύ το ότι αφιέρωσες το χρόνο σου. Thanks :)

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

Έτσι ακριβώς :)




More information about the Linux-greek-users mailing list