Я хочу убить процесс, начатый (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))
Если вы хотите, чтобы приложение было прекращено, вы отправляете 'SIGTERM' (15). С помощью 'SIGKILL' приложение не получает очистки, так как оно никогда не получает сигнал. ОС «SIGKILL» обрабатывается ОС, поэтому его можно использовать в качестве последнего средства перед удалением или исправлением этого приложения перед его повторным использованием. – Sylwester
@Sylwester Я попробовал 'SIGTERM' (15) раньше с тем же результатом. Понял, если 'SIGTERM' не делает сделку' SIGKILL' должен. Хотя спасибо за общую замечательную концепцию. – Sim
Когда я удаляю '(sb-ext: процесс-закрыть процесс)' и меняет сигнал на '15', это работает для меня. Я не уверен, что должен делать 'sb-ext: process-close'. – Sylwester