Killing-Process woes
Ronald Fischer
ynnor@mm.st
Tue Jun 20 13:30:00 GMT 2017
> > The background processes are actually (zsh-) scripts, which do some
> > setup (basically setting various environment variables), and then invoke
> > a (Cygwin-)Ruby program which does the "real work". The program is
> > executed by something like
> >
> > ruby myprog.rb
> >
> > (Note that this Ruby program is NOT invoked in background).
> >
> > When my SIGINT trap is entered, I can see from ps indeed the
> > relationship between the processes involved, for instance
> >
> > 10852 9296 6224 10536 cons3 3672028 08:05:10
> > /usr/bin/ruby
> > 9296 6224 6224 11236 cons3 3672028 08:05:10
> > /usr/bin/zsh
> >
> > The PID of my background process - the zsh wrapper - in this concrete
> > case is 9296, and we can see that this is the parent of the Ruby
> > process, 10852. The problem is that if I just kill 9296, the Ruby
> > process keeps running, orphaned:
> >
> > 10852 1 6224 10536 cons3 3672028 08:05:10
> > /usr/bin/ruby
> >
> > I've found on Stackoverflow the suggestion to treat this as a process
> > group and use negative PIDs. I tried this too, but it didn't work. Here
> > is a similar example:
> >
>
> Not implemented as you found out below. But I don't know that the
> negative process number is in use anywhere. Are you sure it wasn't a
> signal number as a option to kill?
No, the article refered to a process group (and this indeed would be
done by negative PIDs), but as I said, this didn't work anyway.
> Perhaps use the -f --force switch might help.
No, doesn't help either.
For the time being, I have reverted to analyzing the output of ps. It is
pretty tedious:
# Get the PID of the shell script
local wrapper_proc=$!
# Give the wrapper some time to start the Ruby process below. Without
this, the
# Ruby process would not be visible yet.
sleep 3
# Find out the PID of the child process of the wrapper
local sub_pid=$(ps |grep -oE "^ *[0-9]+ *$wrapper_proc "|awk ' {print
$1}')
# Sanity check ....
if [[ $sub_pid =~ ^[0-9]+$ ]]
then
# Add this to the array of these child processes
additional_pids+=$sub_pid
else
echo "Info: Could not extract VP pid from '$sub_pid'"
fi
Inside my SIGINT trap, I do not only kill the processes found via
$jobstates, but also the processes collected in $additional_pids. An
awful solution, and one which is not easy to maintain and may break!
Ronald
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
More information about the Cygwin
mailing list