2015-02-28 2 views
2

Я хочу убить процесс, начатый (sb-ext:run-program).Как убить процесс (созданный run-process)

(let ((process (sb-ext:run-program "/path/to/process.sh" '() :wait nil))) 
    (sleep 10) 
    (sb-ext:process-close process) 
    (sb-ext:process-kill process 9 :pid)) 

По SBCL-Manual(sb-ext:process-kill process 9 :pid) следует отправить SIGKILL(which has value 9) в process, поэтому уничтожив этот процесс.

Но когда я пытаюсь использовать это, используя фиктивный процесс:

#!/bin/bash 

i=0 
while [ $i -lt 4 ] 
do 
sleep 5 
i+=1 
done 

Это оставляет корпус сзади, который не может даже быть убит с помощью Htop + убить.

Процесс дерево перед выполнением выглядело следующим образом:

|- /usr/bin/emacs 
| |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 

В процессе выполнения:

|- /usr/bin/emacs 
| |- /usr/local/bin/sbcl 
| | |- /bin/bash /path/to/process.sh 
| | | |- sleep 5 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 

После исполнения места (process.sh не прекращается, если основной SbCl не будет убит/остановлен):

|- /usr/bin/emacs 
| |- /usr/local/bin/sbcl 
| | |- process.sh 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 
| | |- /usr/local/bin/sbcl 

Сценарий может быть убит и полностью прекращен при запуске вручную используя Ctr-C или htop + kill.

Поэтому, как я могу достичь бесшовного/бездетного убийства внутри sbcl?

То же самое происходит при использовании:

(let ((process (sb-ext:run-program "/usr/local/bin/sbcl" '("--dynamic-space-size" "512" "--eval" "(sleep 100)") :wait nil))) 
    (sleep 10) 
    (sb-ext:process-close process) 
    (sb-ext:process-kill process 9 :pid)) 
+0

Если вы хотите, чтобы приложение было прекращено, вы отправляете 'SIGTERM' (15). С помощью 'SIGKILL' приложение не получает очистки, так как оно никогда не получает сигнал. ОС «SIGKILL» обрабатывается ОС, поэтому его можно использовать в качестве последнего средства перед удалением или исправлением этого приложения перед его повторным использованием. – Sylwester

+0

@Sylwester Я попробовал 'SIGTERM' (15) раньше с тем же результатом. Понял, если 'SIGTERM' не делает сделку' SIGKILL' должен. Хотя спасибо за общую замечательную концепцию. – Sim

+0

Когда я удаляю '(sb-ext: процесс-закрыть процесс)' и меняет сигнал на '15', это работает для меня. Я не уверен, что должен делать 'sb-ext: process-close'. – Sylwester

ответ

4

Решение выглядит либо как это (если использовать потоки, связанные с процессом вы должны процесс-близко):

(let ((process (sb-ext:run-program "/home/user/processTest.sh" '() :wait nil))) 
    (sleep 10) 
    (sb-ext:process-kill process 15 :pid) 
    (sb-ext:process-wait process) 
    (sb-ext:process-close process) 
    (sb-ext:process-exit-code process)) 

Или, как Сильвестр указал, что вы можете просто оставить process-close (если у вас нет потоков, связанных с процессом):

(let ((process (sb-ext:run-program "/home/user/processTest.sh" '() :wait nil))) 
    (sleep 10) 
    (sb-ext:process-kill process 15 :pid))         

process-close влияет на процесс таким образом, что он станет zombie.

Это происходит для дочерних процессов, где запись все еще необходима, чтобы родительский процесс мог прочитать статус выхода своего ребенка.

Как только состояние выхода считывается через process-exit-code, процесс забирается и исчезает.

+0

В Windows нет эквивалента, реализованного в Windows; process-close работает в потоке, но процесс остается со статусом: running. SBCL не выполняет процесс-kill для Windows. Одним из вариантов является использование «cmd/c taskkill/f/pid», за которым следует PID окон вашего процесса. Этот PID может быть получен с помощью (sb-alien: define-alien-procedure («GetProcessId» get-process-id) sb-win32: dword (дескриптор sb-win32: handle)), а затем вызов (get-process- id (sb-ext: process-pid )). Благодаря | 3b | из #lisp на irc.freenode.net для этого решения. –

Смежные вопросы