[Avocado-devel] Subprocess termination

Lucas Meneghel Rodrigues lookkas at gmail.com
Mon Feb 20 13:02:36 UTC 2017


Still, Cleber's point is valid and coincides with my view. If you create a
subprocess that runs in the background, then you should keep track of it
and reap it in the cleanup procedures.

On Mon, Feb 20, 2017 at 1:13 PM Andrei Stepanov <astepano at redhat.com> wrote:

> Hi
>
> Cleber, I think your example is not completely correct. You use "jobs".
> Bash/csh/zsh jobs is another topic.  Your example is about bash jobs.
> Let's take a look a level up:
>
> 1. open xterm/gnome-terminal.
> 2. Run + put it in background: sleep 600 &
> 3. Close the terminal.
> 4. Check for processes. sleep is not disconnected.
>
>
>
>
> On Mon, Feb 20, 2017 at 12:42 PM, Cleber Rosa <crosa at redhat.com> wrote:
>
> Hey guys,
>
> I think the following experiment can be didactic:
>
>  $ echo $$
>  1000
>  $ /bin/bash
>  $ echo $$
>  1010
>  $ sleep 600 &
>  $ exit
>  $ echo $$
>  1000
>  $ ps -eo ppid,cmd | grep sleep
>  1 sleep 600
>
> We can say that shell with PID 1000 is Avocado, PID 1010 is your test
> process, and sleep is the subprocess you're running on your test.
>
> What does this mean?  When a parent does not wait() for their children
> processes, they find a new parent.  That's simply how UNIX/Linux work.
>
> A process is indeed a resource.  Just like a file on a filesystem.  If
> you don't want it lying around on your system after you created it, you
> have to take actions.
>
> My point is: IMHO there's nothing broken with Avocado in this regard.
> If you want automatic ("automagic") resources cleanup, something like
> running tests on a VM with a snapshot is the way to go. But the most
> correct way is indeed trying to keep track of the resources you create
> on your test.
>
> - Cleber.
>
> On 02/17/2017 12:48 PM, Andrei Stepanov wrote:
> > Hi.
> >
> > It seems to me, that you are talking about global task: "track of
> > special resources"
> >
> > Radek's case is much simple: kill all children.
> >
> > I think it is correct behavior. This is as it should be.
> >
> > There is nothing to track.
> >
> > On opposite side, if test want to keep running process that it can
> > detach it and make it daemon.
> >
> >
> >
> > On Fri, Feb 17, 2017 at 6:11 PM, Lucas Meneghel Rodrigues
> > <lookkas at gmail.com <mailto:lookkas at gmail.com>> wrote:
> >
> >     I would avoid keeping track of special resources by the test runner
> >     itself. It's the sort of thing that the test writer would be
> >     expected to implement on cleanup procedures.
> >
> >     Implementing said track of subprocesses would be justifiable if we
> >     look at the following perspectives:
> >
> >     1) We want to reduce the amount of boilerplate code in tests. This
> >     would hold true if Radek's use case was very common, like in many
> >     occasions you want to spawn a process in the background and forget
> >     about it. It doesn't seem it is.
> >     2) We want avocado to be very good in avoid leaking resources
> >     regardless of decisions made by test writers.
> >
> >     I can see the point 2) as valid, but again, it's introducing a lot
> >     of code to handle certain resources transparently for users that
> >     might not need that on a regular basis.
> >
> >     On Fri, Feb 17, 2017 at 11:55 AM Amador Pahim <apahim at redhat.com
> >     <mailto:apahim at redhat.com>> wrote:
> >
> >         On Fri, Feb 17, 2017 at 9:42 AM, Radek Duda <rduda at redhat.com
> >         <mailto:rduda at redhat.com>> wrote:
> >         > Good morning folks,
> >         > Andrei thanks  for this line of code I've forgotten to include
> >         it. So the
> >         > code reads:
> >         >
> >         > def run(vt_test, test_params, env):
> >         >   cmd = "nc -l %s" % test_params['some_port']
> >         >   nc_process = process.SubProcess(cmd)
> >         >   nc_process_pid = nc_process.start()
> >         >   return
> >         >
> >         > Amador thanks for your advice, but it doesn't work for me. I
> >         need the
> >         > process to run in the background and not block test flow.
> >         That's why I used
> >         > start() method. I tried run() method as well, but the process
> >         does not go to
> >         > background and blocked test flow. I think the process should
> >         be killed
> >         > automatically after test finishes.
> >
> >         Oh, now I see what you need.
> >         Well, I'd recommend to finish the process in tearDown(). Not
> sure if
> >         we should make the runner to track the sub-processes created by
> the
> >         test... let me open a card to discuss that.
> >
> >
> >         >
> >         > Radek
> >         >
> >         > On Thu, Feb 16, 2017 at 5:09 PM, Amador Pahim
> >         <apahim at redhat.com <mailto:apahim at redhat.com>> wrote:
> >         >>
> >         >> On Thu, Feb 16, 2017 at 5:02 PM, Andrei Stepanov
> >         <astepano at redhat.com <mailto:astepano at redhat.com>>
> >         >> wrote:
> >         >> > I think
> >         >> >
> >         >> > nc_process_pid = nc_process.start()
> >         >>
> >         >> In that case, the missing part is the `wait()` (and the
> possible
> >         >> timeout handling) which are both present in `run()`. You can
> >         call it
> >         >> directly (with `process.run(cmd)`) instead of keeping the
> >         SubProcess
> >         >> object. Unless you have other reasons to have that object.
> >         >>
> >         >> >
> >         >> > On Thu, Feb 16, 2017 at 4:58 PM, Amador Pahim
> >         <apahim at redhat.com <mailto:apahim at redhat.com>> wrote:
> >         >> >>
> >         >> >> On Thu, Feb 16, 2017 at 4:38 PM, Radek Duda
> >         <rduda at redhat.com <mailto:rduda at redhat.com>> wrote:
> >         >> >> > Dear avocado users and developers,
> >         >> >> > I have made a testcase in which is executed nc process
> >         in run
> >         >> >> > function :
> >         >> >> > (simplified version):
> >         >> >> >
> >         >> >> > from avocado.utils import process
> >         >> >> >
> >         >> >> > def run(vt_test, test_params, env):
> >         >> >> >   cmd = "nc -l %s" % test_params['some_port']
> >         >> >> >   nc_process = process.SubProcess(cmd)
> >         >> >> >   return
> >         >> >> >
> >         >> >> > after testcase is executed, nc does not terminate and is
> >         still
> >         >> >> > present.
> >         >> >> > To
> >         >> >> > avoid this I have to kill the process e.g. by
> >         >> >> > process.safe_kill(nc_process_pid, signal.SIGKILL)
> >         >> >>
> >         >> >> Are you running the process with `nc_process.run()`? It's
> >         expected to
> >         >> >> wait for the process to finish.
> >         >> >>
> >         >> >>
> >         >> >>
> >         >> >>
> >
> https://github.com/avocado-framework/avocado/blob/master/avocado/utils/process.py#L596-L643
> >         <
> https://github.com/avocado-framework/avocado/blob/master/avocado/utils/process.py#L596-L643
> >
> >         >> >>
> >         >> >>
> >         >> >> >
> >         >> >> > It is pretty awkward to close the process manually
> >         particularly in
> >         >> >> > case
> >         >> >> > of
> >         >> >> > complex testcase code
> >         >> >> > Shouldn't be the subprocess killed automatically after
> >         test exits?
> >         >> >> > After all its called SubProcess
> >         >> >> >
> >         >> >> >
> >         >> >> > regards,
> >         >> >> >
> >         >> >> > Radek Duda
> >         >> >>
> >         >> >
> >         >
> >         >
> >
> >
>
> --
> Cleber Rosa
> [ Sr Software Engineer - Virtualization Team - Red Hat ]
> [ Avocado Test Framework - avocado-framework.github.io ]
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/avocado-devel/attachments/20170220/f3140c45/attachment.htm>


More information about the Avocado-devel mailing list