[pkg-wpa-devel] Bug#401645: wpasupplicant is stopped too early at reboot/shutdown

Przemyslaw Bruski pbruskispam at op.pl
Wed Dec 6 23:55:50 CET 2006


Hi Kel,

Kel Modderman wrote:
> I though I was either crazy, or you were whispering sweet nothings in my ear, 
> because on my boxen sendsigs was still at sequence number 20. Then I found 
> this in /usr/share/doc/initscripts/changelog.Debian.gz:
>   

<blushes> Sorry about that.

Hmm. I think this is no longer wpasupplicant issue, but please do not 
close that bug, it it's OK
with you. My suggestion would be to ask the sysvinit guys to replace 
sendsigs with the following script
(not sure if the attachment will come through, if it does not, I will 
repost the script body).

Basically, in this script killall5 is replaced by a shell function that 
does the same and takes command names
as parameters. These command are never killed.

It solves both the wpasupplicant issue and usplash issue (I did not test 
the latter, I admit).

The following sequence would be needed:
1. new (well, let's call it my) sendsigs would have to be run before 
umountnfs
2. umountnfs
3. wpasupplicant
4. original sendsigs (or mine running without exceptions).

What would also be needed is you backing this solution, of course ;-)


bye,

Przemek


-------------- next part --------------
#! /bin/sh
### BEGIN INIT INFO
# Provides:          sendsigs
# Required-Start:    
# Required-Stop:     umountnfs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Kill all remaining processes except for crucial ones.
# Description: 
### END INIT INFO

PATH=/usr/sbin:/usr/bin:/sbin:/bin

. /lib/lsb/init-functions

#lists all ancestor pids, until pid number 0 is reached
getAncestorPids() {
	local pid=$1
	local ppids=

	while true; do
		ppid=$(ps --no-headers --format ppid $pid)
		if [ $ppid -eq 0 ]; then
			break;
		fi
		ppids=$ppid" "$ppids
		pid=$ppid
	done
	echo $ppids
}


# Replacement for killall5 command. Just like killall5 does, it sends
# a signal to all processes except for: ancestor processes, itself
# and kernel threads.
# Addtionally, it skips all processes that had been run using command
# name passed as a parameter.
#
# arguments:
# signalnumber
# list of command names that should not be killed
killall5_except() {
	local signalNumber="$1"
	shift 
	local myPid=$$
	local preciousPids=$(ps --no-headers --format pid -C "$*")
	#initial precious pids are: my pid and pids of processes given as parameters
	preciousPids=$myPid" "$preciousPids
	local ancestorPids=

	for preciousPid in $preciousPids; do
		local sessionLeaderPid=$(ps --no-headers --format session $preciousPid)
		ancestorPids=$ancestorPids" "$(getAncestorPids $preciousPid)
	done

	#kernel threads should not be killed too. Kernel threads have userspace size of 0.
	local kernelThreadPids=$(ps --format pid,size --no-headers -A | grep " "0$| sed -e s/" [^ ]*$"//)

	allPreciousPids="$preciousPids $ancestorPids $kernelThreadPids"

	allPidsToTerminate=$(ps --deselect --no-headers --format pid --pid $allPreciousPids)
	
	#a trick to eliminate ps pid from the list
	allPidsToTerminate=$(ps --no-headers --format pid --pid $allPidsToTerminate)
	
	if [ ! -z "$allPidsToTerminate" ]; then
	    kill $signalNumber $allPidsToTerminate
	fi
}

do_stop () {
	# Kill all processes.
	log_action_begin_msg "Asking all remaining processes to terminate"
	killall5_except -15 wpa_supplicant usplash
	log_action_end_msg 0
	sleep 5
	log_action_begin_msg "Killing all remaining processes"
	killall5_except -9 wpa_supplicant usplash
	log_action_end_msg 0
}

case "$1" in
  start)
	# No-op
	;;
  restart|reload|force-reload)
	echo "Error: argument '$1' not supported" >&2
	exit 3
	;;
  stop)
	do_stop
	;;
  *)
	echo "Usage: $0 start|stop" >&2
	exit 3
	;;
esac

:


More information about the Pkg-wpa-devel mailing list