无法在终端后台运行无限循环过程。

时间:2016-06-25 11:10:51

标签: bash process

我正在尝试使用Season1 Episode8进程和工作进展的视频。我有一个在Ubuntu 16.04上运行的bash终端。

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间隔中进行一系列ping操作

关于为什么会发生这种情况以及如何在背景中以1s间隔实际获得一系列ping的任何想法都将不胜感激。

5 个答案:

答案 0 :(得分:1)

尝试:

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

结果:

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

或使用子shell:

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

结果:

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

答案 1 :(得分:0)

使用&amp;运行命令最后,而不是停止它。 ^ Z太窄而无法使用这样的命令。

答案 2 :(得分:0)

您可以通过添加&amp;运行该命令。最后,你可能会发现更多麻烦来结束这个过程。

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

正如您所看到的,您将不得不使用Cntrl + D或终止进程来阻止它。

另一个选择是使用'screen'

假设您已安装屏幕,请输入终端并执行命令'screen'

然后你可以执行命令:

 while true; do echo ping; sleep 1; done

然后按Cntrl A然后按D(保持Cntrl按下它自己)。这将使您与屏幕分离,您可以执行任何操作,命令将在后台执行。

您可以随时列出当前正在执行的屏幕

screen -ls

然后执行

连接到屏幕
screen -r screen_name

这听起来有点复杂但是处理事情的更好方法。您可以找到更多详细信息 Here

答案 3 :(得分: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]&amp; bash给你的2849。第一个是后台进程号。比如说,如果你想把这个过程带到前面,你可以使用这个数字

fg 1 # Here fg stands for foreground

第二个数字是进程ID,即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  &

答案 4 :(得分:-1)

您可以尝试这样的事情:

while true; do 
 echo ping 1
 sleep 1
done;

请注意,我只在;上放置了分号done - 标记了语句的结尾。我在我的终端上试过这个并且表现得像你期望的那样。