如果我们在后台运行流程,我们会看到流程pid和输出:
# echo cho &
cho
19078
是否可以制作:
# echo cho &
cho
为什么我需要这个?
我想编写一个简单的内联局域网扫描程序,只有一些没有nmap
或arp-scan
等实用程序的PC的ping。
for ip in 192.168.1.{1..254}; do (ping -c 1 -t 1 $ip > /dev/null && echo ">>> ${ip} is up"; ) & done
它有效但PID会破坏输出。
答案 0 :(得分:0)
我只是将for
循环本身作为后台的单个作业运行。也没有必要使用括号在子shell中运行任何命令(使用Bash,使用&
控件操作符自动创建子shell以运行命令)。在循环中分叉的进程越少,它运行得越快。
for ip in 192.168.1.{1..254}; do ping -c 1 -t 1 $ip > /dev/null &&
echo ">>> ${ip} is up"; done &
如果您不希望将任何作业控制反馈打印到屏幕上,可以将后台循环括在括号中,以便它在另一个子shell级别中运行:
( for ip in 192.168.1.{1..254}; do ping -c 1 -t 1 $ip > /dev/null &&
echo ">>> ${ip} is up"; done & )
更好的解决方案是将echo
语句的输出重定向到文件并保留作业控制输出,以便shell在循环结束时通知您。您可以继续使用shell,避免终端因背景中运行的循环打印出来而变得混乱。
for ip in 192.168.1.{1..254}; do ping -c 1 -t 1 $ip > /dev/null
&& echo ">>> ${ip} is up"; done > hosts_up &
注意:以上命令可以作为单行运行,但我在这里使用两行来避免水平滚动(一行末尾的&&
表示命令的其余部分继续以下一行)。
答案 1 :(得分:0)
(echo cho &)
循环:
for ip in 192.168.23.{1..254}; do (ping -c 1 -t 1 $ip > /dev/null && echo ">>> ${ip} is up" &) done