[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [master 1/2] Restarting anaconda.



Ah, this is a very interesting hack.  Let's just make sure no one in the
outside world ever finds out and assumes this is officially supported.

> diff --git a/loader/loader.c b/loader/loader.c
> index 84fd116..6a701e4 100644
> --- a/loader/loader.c
> +++ b/loader/loader.c
> @@ -1712,6 +1712,13 @@ void loaderUsrXHandler(int signum) {
>      init_sig = signum;
>  }
>  
> +int restart_anaconda() {
> +    if (access("/tmp/restart_anaconda", R_OK))
> +        return 0;
> +    puts("Restarting Anaconda.");
> +    return 1;
> +}
> +

Why puts here instead of fprintf?

> diff --git a/scripts/restart-anaconda b/scripts/restart-anaconda
> new file mode 100755
> index 0000000..aed4758
> --- /dev/null
> +++ b/scripts/restart-anaconda
> @@ -0,0 +1,55 @@
> +#! /bin/bash
> +#
> +# restart-anaconda: Debugging tool to restart stage2 Anaconda.
> +#
> +# Copyright (C) 2010
> +# Red Hat, Inc.  All rights reserved.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty of
> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +# GNU General Public License for more details.
> +#
> +# You should have received a copy of the GNU General Public License
> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
> +#
> +
> +RESTART_FILE=/tmp/restart_anaconda
> +LOADER_PID=`cat /var/run/loader.run`
> +ANACONDA_PID=`cat /var/run/anaconda.pid`
> +
> +descendants() {
> +    PID=$1
> +    DIRECT=`ps --ppid $PID -o pid=`
> +    INDIRECT=''
> +    for child in $DIRECT; do
> +	INDIRECT+=' '`descendants $child`
> +    done
> +    # prepend grandchildren, we are goingt to kill them first  
> +    DESCENDANTS=$INDIRECT' '$DIRECT
> +    echo $DESCENDANTS
> +}
> +
> +anaconda_descendants() {
> +    descendants $ANACONDA_PID
> +}
> +
> +# this is how loader knows it should restart stuff
> +touch $RESTART_FILE
> +
> +# kill all anaconda descendants and anaconda itself
> +RESTART_VICTIMS=`anaconda_descendants` 
> +RESTART_VICTIMS+=' '$ANACONDA_PID
> +echo "killing processes: " $RESTART_VICTIMS
> +for child in $RESTART_VICTIMS; do
> +    kill -s KILL $child &>/dev/null
> +done
> +
> +# give loader some time to pick up the restart file 
> +sleep 1
> +rm -f $RESTART_FILE

Have you tried killing all processes in anaconda's process group and
seeing what happens that way?  If that worked, it could be a cleaner way
of accomplishing the same thing as above, plus would handle arbitrarily
deep trees of child processes.

- Chris


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]