| #!/bin/sh |
| |
| # This script will kill some important system daemons and make sure |
| # that they have been automatically restarted. |
| |
| OLD_PID=0 |
| PID=0 |
| |
| # Time to wait for upstart to restart a daemon in seconds |
| RESTART_TIMEOUT=5 |
| |
| # Verifies that the given job is running and returns the pid. |
| get_job_pid() { |
| local upstart_job=$1 |
| local daemon=$2 |
| local status="" |
| local upstart_pid="" |
| local pgrep_pid="" |
| |
| PID=0 |
| |
| # First make sure that upstart thinks it is running. |
| status="$(initctl status "$upstart_job")" |
| echo "$status" | grep "start/running" |
| if [ $? -ne 0 ] ; then |
| echo "Job $upstart_job is not running." |
| return 1 |
| fi |
| |
| # Now make sure that upstart has the pid that we would expect for this job |
| local upstart_pid=$(echo $status | awk '{ print $NF }') |
| if [ -z "$upstart_pid" ] ; then |
| echo "Upstart not able to track pid for job: $upstart_job" |
| return 1 |
| fi |
| local pgrep_pid=$(pgrep -o $daemon) |
| if [ -z "$pgrep_pid" ] ; then |
| echo "Unable to find running job for daemon: $daemon" |
| return 1 |
| fi |
| if [ "$upstart_pid" != "$pgrep_pid" ] ; then |
| echo "Upstart and daemon pids don't match: $upstart_pid vs $pgrep_pid" |
| return 1 |
| fi |
| |
| # Everything checks out. |
| PID=$upstart_pid |
| } |
| |
| # The set of jobs (and corresponding daemon names) to test. |
| # TODO: Test more jobs that have the respawn stanza |
| UPSTART_JOBS_TO_TEST="htpdate:htpdate udev:udevd" |
| |
| for job in $UPSTART_JOBS_TO_TEST ; do |
| |
| JOB=$(echo "$job" | awk -F':' '{ print $1 }') |
| DAEMON=$(echo "$job" | awk -F':' '{ print $2 }') |
| |
| get_job_pid "$JOB" "$DAEMON" |
| if [ $PID -le 0 ] ; then |
| echo "Error: It looks like job '$JOB' is not running." |
| exit 255 |
| fi |
| |
| OLD_PID=$PID |
| kill -KILL $PID |
| |
| for x in $(seq ${RESTART_TIMEOUT}); do |
| sleep 1 |
| |
| get_job_pid "$JOB" "$DAEMON" |
| if [ $PID -gt 0 ] ; then |
| break |
| fi |
| done |
| |
| if [ $PID -le 0 ] ; then |
| echo "Error: Job '$JOB' was not respawned properly." |
| exit 255 |
| fi |
| if [ $PID -eq $OLD_PID ] ; then |
| echo "Error: Job '$JOB' retained the same pid; something went wrong." |
| exit 255 |
| fi |
| |
| done |
| |
| exit 0 |