[Avocado-devel] Subprocess termination
Andrei Stepanov
astepano at redhat.com
Mon Feb 20 12:13:10 UTC 2017
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/69b94ffa/attachment.htm>
More information about the Avocado-devel
mailing list