-
Linux 系统提供了
fork()
系统调用,用于在子进程中执行某个命令,可以在脚本中使用该系统调用来实现 fork 线程。下面是在脚本中使用fork()
系统调用来实现 fork 线程的示例脚本:
#!/bin/bash
# 定义计数器
count=0
# 获取网段信息
read -p "请输入网段的前三个数字(如 192.168.0): " subnet
# 循环 ping 网段内的 IP
for i in {1..254}; do
# 拼接 IP 地址
ip=${subnet}.${i}
# 在子进程中执行 ping 命令
{
ping -c 1 $ip >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
# 如果 ping 成功,打印 IP 地址
echo "IP 地址 ${ip} 可以访问"
fi
} & # 在子进程中运行,并将子进程放入后台执行
count=$((count+1))
# 控制后台任务数量,避免并发过多
if [[ $count -eq 32 ]]; then
wait # 等待 32 个后台任务完成
count=0
fi
done
wait # 等待所有后台任务完成
-
在该脚本中,将 ping 命令放入子进程中执行,并使用
&
符号将子进程放入后台执行。同时使用计数器count
来控制后台任务的数量,最多只能同时运行 32 个子进程,以避免并发过多导致系统负载过高。 -
需要注意的是,在使用 fork 线程之前,需要了解 fork 线程的原理和特性,并根据实际情况进行合理的调整和优化。
[root@nodex0 ~]# ./pings.sh
请输入网段的前三个数字(如 192.168.0): 192.168.2
IP 地址 192.168.2.1 可以访问
IP 地址 192.168.2.61 可以访问
IP 地址 192.168.2.116 可以访问
IP 地址 192.168.2.157 可以访问
IP 地址 192.168.2.147 可以访问
IP 地址 192.168.2.180 可以访问
IP 地址 192.168.2.219 可以访问