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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#!/bin/sh -T
# $FreeBSD$
# Copyright (c) 2003 Cyrille Lefevre. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. The name of the authors and contributors may not be used to
# endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
setistart () { # dir
local dir
dir=$1
# goto the startup dir
cd ${dir} || return
# don't start a dying client
[ -f stop_after_send.txt ] && return
# fire up a setiathome client
${program_path} ${program_args} > /dev/null &
# memorize the startup dir
eval pid_$!=${dir}
# and the client process ID
setipids="${setipids} $!"
}
setikill () { # SIGTERM handler
local pids pid
# save pids to kill
pids="${sleeppid} ${setipids}"
# avoid futher setiathome startup
unset setipids
# kill'em all if any
for pid in ${pids}; do
ps p ${pid} > /dev/null && kill ${pid}
done
}
setirestart () { # SIGCHLD handler
local pids pid dir
# killing in progress
[ -n "${setipids}" ] || return
# restart in process
[ -n "${sleeppids}" ] && return
# wait for setiathome servers to come up
sleep ${seti_sleep_time} &
# wait even if more than one setiathome client dies
sleeppid=$!
while ps p ${sleeppid} > /dev/null; do
wait ${sleeppid}
done
unset sleeppid
# killing while sleeping
[ -n "${setipids}" ] || return
# save pids to restart
pids=${setipids}
# reset the process ID list
unset setipids
for pid in ${pids}; do
if ps p ${pid} > /dev/null; then
# still alive
setipids="${setipids} ${pid}"
else
# backup the startup dir
eval dir=\${pid_${pid}}
# clean the old one
unset pid_${pid}
# launch the dead client
eval setistart ${dir}
fi
done
}
if [ -z "${program_path}" ]; then
case $0 in
/*) rc_dir=${0%/*} ;;
*) rc_dir=${PWD:-$(pwd)} ;;
esac
rc_file=${0##*/}
rc_path=${rc_dir}/${rc_file}
if ! PREFIX=$(expr ${rc_path} : "\(/.*\)/libexec/${rc_file}\$"); then
echo "${rc_file}: Cannot determine PREFIX." >&2
echo "Please use the complete pathname." >&2
exit 64
fi
echo "Don't use this script directly, uses the following one instead :" >&2
echo " ${PREFIX}/etc/rc.d/${rc_file%.bin}.sh start" >&2
exit 1
fi
# save this shell process ID
echo $$ > ${seti_wrkdir}/shpid.sah
# setup handlers
trap setikill TERM
trap setirestart CHLD
# startup setiathome client(s)
for dir in ${seti_wrksuff}; do
setistart ${seti_wrkdir}/${dir}
done
# wait for them until death
while [ -n "${setipids}" ]; do
wait
done
|