运行背景时删除bash中的显示pid

时间:2016-01-28 15:46:13

标签: bash background-process

如果我们在后台运行流程,我们会看到流程pid和输出:

# echo cho &
cho
19078

是否可以制作:

# echo cho &
cho

为什么我需要这个?

我想编写一个简单的内联局域网扫描程序,只有一些没有nmaparp-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会破坏输出。

2 个答案:

答案 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