Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

bgExec - need linux pid

48 views
Skip to first unread message

Peter Prockers

unread,
Feb 7, 2012, 10:05:20 PM2/7/12
to
At the moment I am using bgExec and I would use something similar if
needed. http://theory.asu.ru/public/download/sites/wiki.tcl.tk/12704

The process I run will run forever, unless killed. Even if the file
channel is closed, the process remains running.

To kill the process I would need to know pid, which I can see with ps
ux in linux console.

How can I get the linux pid (ps ux) after starting a process? I could
phrase "ps ux" before and after bgExec but I am looking for a more
elegant way. How to do it?

Ian Gay

unread,
Feb 7, 2012, 10:44:12 PM2/7/12
to
--

If you know the process name you could use pgrep.
(And indeed, you could kill with pkill.)

*********** To reply by e-mail, make w single in address **************

M. Strobel

unread,
Feb 8, 2012, 4:05:54 AM2/8/12
to
Do it like this:

strobel@s114-intel:~> tclsh
% puts "my process id is: [pid]"
my process id is: 3741
%

/Str.

Alexandre Ferrieux

unread,
Feb 8, 2012, 5:30:35 AM2/8/12
to
On Feb 8, 4:05 am, Peter Prockers <peter.prock...@googlemail.com>
wrote:
> At the moment I am using bgExec and I would use something similar if
> needed.http://theory.asu.ru/public/download/sites/wiki.tcl.tk/12704
>
> The process I run will run forever, unless killed. Even if the file
> channel is closed, the process remains running.
>
> To kill the process I would need to know pid, which I can see with ps
> ux in linux console.
>
> How can I get the linux pid (ps ux) after starting a process? I could
> phrase "ps ux" before and after bgExec but I am looking for a more
> elegant way. How to do it?

set ff [open "|some command w"]
set p [pid $ff]
close $ff

Note that if "some command" is a shell script, killing it will not
necessarily affect its children.
Two approaches to this problem:

(1) arrange for 'some command' to remain the important process to
kill. Typically to do this in a shell script, you do all your
preparations in sh, then end with "exec foo bar baz ..." (this is sh's
exec, not Tcl's).

(2) use 'setsid' to allocate a new process group, which will be -$p,
and kill the group:

set ff [open "|setsid some command w"]
set p [pid $ff]
close $ff

(later)

kill -$p

-Alex


M. Strobel

unread,
Feb 8, 2012, 5:58:56 AM2/8/12
to
Am 08.02.2012 04:05, schrieb Peter Prockers:
Alex Ferrieux just wrote it, but let me improve my first answer, I checked that myself:

The bgexec from http://wiki.tcl.tk/12704 does an open on a process pipeline, i.e.

open "| myprog"

The manual about open, command pipeline, says: The id of the spawned process is
accessible through the pid command, using the channel id returned by open as argument.

/Str.

Uwe Klein

unread,
Feb 8, 2012, 11:42:58 AM2/8/12
to
from the original blt man page on bgexec:
You can also terminate the program by setting the variable
myStatus. If myStatus is set before du has completed, the
process is killed. Under Unix, this is done sending by a
configurable signal (by default it's SIGKILL). Under
Win32, this is done by calling TerminateProcess. It makes
no difference what myStatus is set to.

there is refactored code from blt around that is accessed
via compilation by way of critcl.
http://wiki.tcl.tk/13400

either use that or copy the SIGKILL functionality ( tclX comes to mind )


uwe
0 new messages