2016-04-02 2 views
1

Пусть вход я следующий в оболочкеКак убить фоновый процесс, созданный в скрипте

(while true; do echo hahaha; sleep 1; done)& 

Тогда я знаю, что могу убить его

fg; CTRL-C 

Однако, если выше команда в сценарии, например tmp.sh, и я запускаю этот скрипт, как его убить?

+0

Вы можете убить последнюю созданную работу с помощью kill $! http://stackoverflow.com/questions/1624691/linux-kill-background-task $! является pid последней работы, которая была запущена. – LinuxDisciple

ответ

1
(while true; do echo hahaha; sleep 1; done)& 
RUNNING_PID=$! 
kill ${RUNNING_PID} 

$! подберут PID процесса, который работает, так что вы можете делать с ним, как вы хотите

+0

Он просит положить все внутри скрипта! Вы должны сохранить pid в файле. Выполнение скрипта приведет к новому процессу bash (дочерний элемент текущего bash) в фоновом режиме. Таким образом, каждая переменная, выполняемая в фоновом режиме bash, не будет доступна через bash сеанса. –

+0

Я читал, как убить процесс, который работает в фоновом режиме, который был порожден в скрипте. Исходя из того, что мой ответ верен, OP не упомянул о необходимости удерживать PID, который будет запущен позднее, после того, как начальный процесс начала процесса был запущен из другого сценария. Я написал много сценариев, которые порождают множество подпроцессов, работающих параллельно на нескольких машинах, и ждут их завершения. Почему все сложности при записи на диск, а затем затуманивание вещей в файловой системе. –

+0

Если вы поместите все в один и тот же скрипт, да, он будет убивать себя почти сразу. Но это не идея вопроса @ Нан Хуа. Он представил сценарий «while true», который работает в фоновом режиме, и попросите определить, как его убить, используя оболочку лидера сеанса, поскольку fg; Ctrl + C не может этого сделать. Запись pid в файл позволит вам получить доступ к pid из любого процесса с правом доступа к файлу. Это не сложность, так как демоны записывают свои pids в файл, чтобы иметь ссылку на непринужденность. –

0

Давайте предположим, что у вас есть Баш скрипт с именем tmp.sh со следующим содержанием:

#!/bin/bash 
(while true; do echo hahaha; sleep 1; done)& 

И вы его исполняете! Конечно, он будет печатать hahaha на stdout каждые 1 секунду. Вы не можете перечислить его с помощью заданий. Но ... это все еще процесс! И это ребенок в лесу нынешнего терминала! Итак:

1 Получить имя файла терминала, подключенного к стандартному вводу:

$tty 
/dev/pts/2 

2- Список процессов, связанных с терминалом (в данном примере мы используем очки/2), и шоу статус с S и отображение в формате леса f:

$ps --tty pts/2 Sf 
PID TTY  STAT TIME COMMAND 
3691 pts/2 Ss+ 0:00 /bin/bash 
3787 pts/2 S  0:00 /bin/bash 
4879 pts/2 S  0:00 \_ sleep 1 

3- Теперь, вы можете увидеть, что пример перечисляет сон 1 команды, которая является дочерним /бункера/bash процесс с PID . Теперь убей его!

kill -9 3787 

Примечания: Не убивайте процесс Баша, который имеет S + статусы, является процессом Баша, который дает вам подсказку! От человека (пс):

s is a session leader 
+ is in the foreground process group 

Рекомендации:

В таком случае, как это, вы должны сохранить PID в файле:

#!/bin/bash 
(while true; do echo hahaha; sleep 1; done)& 
echo $! > /path/to/my_script.pid 

Тогда вам может просто сделать какой-то сценарий, чтобы отключить его:

#!/bin/bash 
kill -9 $(cat /path/to/my_script.pid) 
Смежные вопросы