[Avocado-devel] Subprocess termination

Andrei Stepanov astepano at redhat.com
Mon Feb 20 13:46:16 UTC 2017


It depends.

There could be a scenario where necessary to run ~ 200 tests at once.
If first bad-by-design test forgets/failed to cleanup, then some sequential
tests also will fail.
It is a question about usability.


Okay, Radek, it seems that we should carefully write our tests, and kill
children processes no matter what of error we have in our tests....., at
least for now.

On Mon, Feb 20, 2017 at 2:02 PM, Lucas Meneghel Rodrigues <lookkas at gmail.com
> wrote:

> 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/e1e353db/attachment.htm>


More information about the Avocado-devel mailing list