2016-06-25 2 views
0

Я пробовал команды по мере того, как прогрессировал видеоролик Season1 Episode8 Processes and Jobs. У меня есть терминал bash, работающий на Ubuntu 16.04.Невозможно запустить бесконечный цикл в фоновом режиме в терминале.

while true; do echo ping; sleep 1; done 
^Z 

Вместо того, чтобы:

[1]+ Stopped    while true; do echo ping; sleep 1; done 

я получаю:

[1]+ Stopped     sleep 1 

bg%1 дополнительно дает только

[1]+ sleep 1 & 

вместо серии пинга в 1s интервала в фон

Любые идеи о том, почему это происходит и как получить серию пинга в интервале 1 с в фоновом режиме, будут оценены.

ответ

1

Try:

bash <<< 'while true; do echo ping; sleep 1; done' 

Результат:

^Z 
[1]+ Stopped     bash <<< 'while true; do echo ping; sleep 1; done' 

Или с помощью подоболочку:

(while true; do echo ping; sleep 1; done) 

Результат:

^Z 
[1]+ Stopped     (while true; do 
    echo ping; sleep 1; 
done) 
+1

да, полностью работает, мой плохой – perreal

0

Заполните свою команду с помощью & в конце, а не остановите ее.^Z слишком узкий для использования с такими командами.

+0

Немного больше информации желательно :) – sjsam

-1

Вы могли бы попробовать что-то вроде этого:

while true; do 
echo ping 1 
sleep 1 
done; 

Обратите внимание, что я только помещенный точкой с запятой ; на done - маркировка конец заявления. Я пробовал это на своем терминале и вел себя так, как вы ожидаете.

+0

Извините, на что это хорошо? – sjsam

0

Вы выполняете команду, добавляя в конце &, что может быть затруднено для завершения процесса.

[email protected]:~$ while true; do echo ping; sleep 1; done& 
[2] 14169 
[email protected]:~$ ping 
ping 
ping 
^C 
[email protected]:~$ ping 
ping 
ping 
^C 
[email protected]:~$ ping 
ping 
ping 
ping 
^C 
[email protected]:~$ ping 
kill 14169 
[email protected]:~$ 

Как вы можете видеть, вам придется использовать Cntrl + D или убить процесс, чтобы остановить его.

Другим вариантом было бы использовать «экран»

Предполагая, что вы экран установлен, введите терминал и выполнить «экран» команду

Затем вы можете выполнить команду:

while true; do echo ping; sleep 1; done 

, а затем нажмите Cntrl A, а затем D (удерживая Cntrl нажатой). Это отделит вас от экрана, и вы сможете делать все, что хотите, и команда будет выполнена в фоновом режиме.

В любое время вы можете перечислить текущий экран, выполняющий

screen -ls 

, а затем подключить к экрану назад, выполнив

screen -r screen_name 

Это звучит немного сложно, но это лучший способ справиться вещи , Вы можете найти более подробную информацию Here

+0

При отправке 'kill -TSTP -pid' для процесса с '&' в конце, процесс приостанавливается (знание получено из ответа @ sjsam). В то время как Ctrl-Z не дает результата. Интересно, что происходит. – Aashaka

+0

Несколько ответов, в том числе и этот, помогли мне увеличить мои знания по этому вопросу. Я поддержал каждого и выбрал один из лучших, подходящих для рассматриваемого дела. Спасибо за вашу помощь :) – Aashaka

0

Заимствование от [ this ] ответ, Ctrl-Z генерирует сигнал [ TSTP ] вашему процессу, и остановка процесса явно не является вашим намерением.

Чтобы запустить процесс в фоновом режиме, сделать

process >/dev/null & 
# Here the '>/dev/null' suppresses any output from the command 
# popping up in the screen, this may or may not be desirable 
# The & at the end tells bash that the command is to be run in backgroud 

Например

$ ping -c 100 192.168.0.1 >/dev/null & 
[1] 2849 

Обратите внимание на два номера [1] & 2849 что Баш дал вам. Первый - это номер фонового процесса. Скажем, если вы хотите, чтобы довести этот процесс до переднего плана, вы могли бы использовать этот номер

fg 1 # Here fg stands for foreground 

Второй номер является идентификатор процесса т.е. 2849. Скажем, вы хотите прекратить процесс, вы можете сделать это, как показано ниже:

kill -9 2849 #-9 is for SIGKILL 

Редактировать

В вашем случае, вы можете обернуть петлю внутри функции, как показано ниже

while_fun() { 
while true 
do 
echo "PING" 
done 
} 

и сделать

while_fun >dev/null & 

Или

while true 
do 
echo "PING" 
done >/dev/null & 
Смежные вопросы