在Unix上的Tcl中,如何杀死用exec启动的后台进程?

时间:2011-02-16 17:26:07

标签: exec tcl kill

我想通过使用Tcl的exec命令从Tcl程序中启动Unix后台进程。但是,我想在将来的任意时间以编程方式从同一个Tcl程序中删除后台进程。我怎样才能做到最好?

bash$ cat loop.bash
#!/bin/bash
while [ 1 ]; do sleep 5; done;

bash$ tclsh

% exec /home/dana/travis/loop.bash &
6598

% puts "How do I kill the background process started by the previous exec command?"
How do I kill the background process started by the previous exec command?

%

3 个答案:

答案 0 :(得分:3)

在tclsh环境中,您仍然可以访问pskill等命令。我重新创建了你的循环脚本,然后进入了一个tclsh会话:

$ tclsh
% exec /path/to/loop.sh &
22267% ps        
  PID TTY          TIME CMD
19877 pts/0    00:00:00 bash
22212 pts/0    00:00:00 emacs-x
22317 pts/0    00:00:00 tclsh
22319 pts/0    00:00:00 loop.sh
22326 pts/0    00:00:00 sleep
22327 pts/0    00:00:00 ps
% kill 22319
% ps      
  PID TTY          TIME CMD
19877 pts/0    00:00:00 bash
22212 pts/0    00:00:00 emacs-x
22317 pts/0    00:00:00 tclsh
22332 pts/0    00:00:00 ps

如果您想从tcl脚本执行此操作,这里有一个简短的示例,它显示了exec'ed进程启动后的ps结果,然后是停止后的结果:

#!/usr/bin/tclsh
set id [exec /path/to/loop.sh &]
puts "Started process: $id"
set ps [exec /bin/ps]
puts "$ps"
exec /usr/bin/kill $id
puts "Stopped process: $id"
set ps [exec /bin/ps]
puts "$ps"

如果您的系统在不同的目录中有ps并且kill,则必须相应地修改脚本。

答案 1 :(得分:2)

有两种方法可以杀死后台进程,假设你保存了PID(为了参数而在一个名为pid的变量中):

运行kill程序

exec kill $pid

使用kill

中的Tclx命令
package require Tclx
kill $pid

两者都有效。两者都允许您选择指定要发送的信号而不是默认值(SIGTERM)。两者都允许您同时将信号发送到多个进程。

答案 2 :(得分:1)

exec命令实际上将返回它启动的进程的PID,如果您在交互式shell上进行RTM或尝试此操作,这一点很明显。

这可以与GreenMatt建议的kill命令结合使用。

% set pid [exec echo "hello" &]
25623
% hello
% echo $pid
25623