我正在尝试使用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的任何想法都将不胜感激。
答案 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
- 标记了语句的结尾。我在我的终端上试过这个并且表现得像你期望的那样。