В Tcl на Unix, как убить фоновый процесс, который был запущен с exec? - PullRequest
4 голосов
/ 16 февраля 2011

Я хотел бы запустить фоновый процесс Unix из программы Tcl, используя команду exec от Tcl.Тем не менее, я хотел бы программно убить фоновый процесс из той же 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 ]

3 голосов
/ 16 февраля 2011

В среде tclsh вы все равно должны иметь доступ к таким командам, как ps и kill. Я заново создал ваш скрипт цикла и затем вошел в сеанс 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-скрипта, вот короткий пример, который показывает результаты ps после запуска exec'ed процесса и затем после его остановки:

#!/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 в разных каталогах, вам придется соответствующим образом изменить скрипт.

2 голосов
/ 17 февраля 2011

Есть два способа уничтожить фоновый процесс, предполагая, что вы сохранили PID (в переменной с именем pid для аргумента):

Запустите программу kill

exec kill $pid

Используйте команду kill от Tclx

package require Tclx
kill $pid

Обе работы.Оба позволяют дополнительно указать сигнал для отправки вместо значения по умолчанию (SIGTERM).Оба позволяют отправлять сигнал более чем одному процессу одновременно.

1 голос
/ 16 февраля 2011

Команда exec фактически возвращает PID процесса, который она запускает, что ясно, если вы используете RTM или попробуете это в интерактивной оболочке.

Это можно использовать в сочетании с командой kill, как предложено GreenMatt.

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