How do you handle while(1) fork(); ?
David Ashley
ashley at hoss.unl.edu
Tue Jul 24 03:07:33 AEST 1990
In <price.648165820 at chakra> price at chakra.unl.edu (Chad Price) writes:
>In <671 at mtune.ATT.COM> jrw at mtune.ATT.COM (Jim Webb) writes:
>>In article <841 at massey.ac.nz>, ARaman at massey.ac.nz (A.V. Raman) writes:
>>> Is there any way to kill all instances of a process that has the
>>> following piece of code in it without having to bring the system down?
>>>
>>> while (1)
>>> fork();
>>Under System V, running "kill -9 -1" will send the kill to all processes
>>belonging to the invoking user. So, to stop the above, you could do that
>>as the user (if s/he has any processes left) or by becoming root and then
>>entering:
>> su pest -c "kill -9 -1"
>>if no process slots are available to the user. Obviously, this kills
>>everything that user is running, not just the above wonderfulness.
>>Have fun.
>>--
>>Jim Webb "Out of Phase -- Get Help" att!mtune!jrw
>> "I'm bored with this....Let's Dance!"
>I think that will not work (personal experience). Any process that is
>doing a while(1)fork(); will drag the system down too far for this to
>help. What you need to do is renice the processes down and then kill them
>all. THe solution is courtesy of Rory Cejka (now at Utah) who did this
>for me when I made the above mistake. This works on Ultrix.
>Use the following 2 shell-scripts (as root):
>#! /bin/sh
># @(#)Renices all processes with lines from a "ps aug" that match
># @(#)the pattern given in the second argument to the priority given
># @(#)in the first argument.
>#
>z=`ps -aug | grep $2 | grep -v grep | grep -v csh | grep -v kill | awk '{ print $2 }'`
>renice $1 $z
>#! /bin/sh
># @(#)Kills all processes with lines from a "ps aug" that match
># @(#)the pattern given in the first argument.
>#
>z=`ps -aug | grep $1 | grep -v grep | grep -v csh | grep -v kill | awk '{ print $2 }'`
>kill -9 $z
>Chad Price
>price at fergvax.unl.edu
This also will not work in all cases due to the following reason.
In a sense a race condition can still arise, even with niced processes and
the killing job renice to -19.
The better solution that we have found is as follows:
Send a stop signal to all processes involved in the while(1) fork();
Then send the kill signal to the processes.
Remark: no renicing is required.
David Ashley (and Rory Cejka)
email: ashley at hoss.unl.edu
(cejka at cs.utah.edu)
More information about the Comp.unix.questions
mailing list