Κλείσιμο του 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