我目前正在编写一个小脚本,需要更新多台服务器上的文件,我有一个很长的服务器 IP 列表,目前我正在使用它ncftpput
来将文件一次添加到服务器中。
我不知道如何ncftpput
从列表中的下一个 IP 地址开始,以便可以同时运行多个更新。
我的列表只是 IP 地址:
192.168.0.1
192.168.0.2
192.168.0.3
......
until 192.168.0.150
我需要的是第一个ncftpput
访问第一个 IP,第二个访问第二个 IP,依此类推,得到我需要/系统可以处理的线程数量。
假设一次有 10 个,当第一个线程完成时,它只会获取其他任何线程都不会获取的下一个 IP。
我希望我已经清楚地说明了我的问题并且有人可以帮助我解决这个问题。
到目前为止,我是这样做的:(一次运行一个)
while read ip; do
ncftpput -c -A -u "$USER" -p "$PASSWD" "$ip" "/usr/local/program/program.conf" < "~/addthisinfo" 2>/dev/null
if [ $? -eq 0 ]
then
echo -e "Here goes my succes test" >>/tmp/text_added
else
echo "$ip failed ! please take care of this"
fi
done <"$pathtoiplist""/iplist"
我一直在尝试使用我在网上找到的一些答案,但我找不到解决办法。我总是ncftpput
从文件顶部开始出现一个或多个新实例,而不是从列表中的下一个 IP 地址开始。
答案1
&
只需在命令末尾放置一个字符ncftpput
即可使其在后台运行并立即将控制权返回给脚本,如下所示:
ncftpput [...] < "~/addthisinfo" 2>/dev/null &
我省略了你的一长串选项,别忘了把它们加回来,而不是[...]
答案2
构建于字节指挥官的回答, 我建议
读取 IP 做 ( ncftpput -c -A -u “$USER” -p “$PASSWD” “$ip” “/usr/local/program/program.conf” < “~/addthisinfo” 如果 [ “$?” -eq 0 ] 然后 echo“这是我的成功测试”>>/tmp/text_added 别的 echo“$ip 失败!请注意” 菲 )& 完成 <“$pathtoiplist/iplist” 2>/dev/null
笔记:
- 这将产生一个异步(后台)子壳
针对 中的每个 IP 地址
iplist
。这允许 shell 检测并记录任何ncftpput
实例(进程)的故障。 - 您已经很好地引用了 shell 变量引用(例如
"$ip"
和"$pathtoiplist"
)。但您还应该引用"$?"
。严格来说,您不需要引用像 这样的简单常量字符串"/usr/local/program/program.conf"
。但这并没有什么坏处。 - 我不确定您是否真的希望
echo
每次成功调用时都这样做,尤其是我不知道为什么要这样做echo -e
(当消息文本不包含任何反斜杠时)。 - 您可能希望将错误(失败)消息发送到文件。由于进程是异步运行的,您可能希望编写单独的错误文件以避免冲突;例如,
echo“$ip 失败!请注意”>“/tmp/$ip.error”
- 为简单起见,我将命令
2>/dev/null
中的移到ncftpput
了循环(行done
)。请注意,您无法使用 执行此操作< "~/addthisinfo"
,因为您需要每个实例单独读取文件。 - 我将
"$pathtoiplist""/iplist"
其改为"$pathtoiplist/iplist"
。只要变量名后的第一个字符(/
在本例中为 )是变量名中不允许的字符,这种方法就是安全的。我对"/tmp/$ip.error"
上面的 , 做了同样的事情。