1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
# -*- sh -*-
# vim:ft=sh:ts=8:sw=4:noet
AddConfigHandler ProgramsOptions
AddConfigHelp "IncompatiblePrograms <process name> [...]" "If there are processes running with any of the names listed (as seen in ps ax), then suspending is aborted. If the --kill option is passed, the offending processes are terminated, and the suspend continues."
ProgramsStop() {
# We'd like to minimise the number of times we have to call ps.
[ -z "$INCOMPATIBLE_PROGRAMS" ] && return 0
local sig
local prog
local signalled
local valid_prog
if [ x"$KILL_PROGRAMS" = "x1" ] ; then
for sig in TERM KILL ; do
vecho 1 -n "Sending processes SIG$sig: "
signalled=
local pid
local tty
local state
local time
local name
local params
ps ax | ( # This fires up a subshell. We can't get any env vars out.
while read pid tty state time name params ; do
valid_prog=0
for prog in $INCOMPATIBLE_PROGRAMS ; do
[ "$prog" = "$name" ] && valid_prog=1 && break
done
[ $valid_prog -eq 0 ] && continue
vecho 1 -n "($name $pid) "
signalled=1
kill -$sig $pid
done ; return $signalled ) || signalled=1
vecho 1
[ -z "$signalled" ] && break
[ $sig != "KILL" ] && sleep 1
done
fi
local pids
pids="`ps ax | awk \"BEGIN { split(\\\"$INCOMPATIBLE_PROGRAMS\\\", progs); for (x in progs) a[progs[x]] = 1 } { if (\\\$5 in a) print}\"`"
[ -z "$pids" ] && return 0
vecho 0 "The following processes are still running and marked as incompatible:
$pids"
return 1
}
ProgramsOptions() {
case $1 in
incompatibleprograms)
[ -z "$INCOMPATIBLE_PROGRAMS" ] && AddSuspendHook 20 ProgramsStop
shift
INCOMPATIBLE_PROGRAMS="$@"
;;
*)
return 1
esac
return 0
}
# $Id$
|