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?
> 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?
--
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 **************
> 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?
Do it like this:
strobel@s114-intel:~> tclsh
% puts "my process id is: [pid]"
my process id is: 3741
%
> 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
> 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?
Alex Ferrieux just wrote it, but let me improve my first answer, I checked that myself:
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.
> 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?
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 )