【发布时间】:2016-05-29 15:20:07
【问题描述】:
我正在管理一个具有多个 中继器(接入点)的 WiFi 网络。
我制作了一个脚本来计算每个连接用户的数量。 AP 1 和 2 的示例:
luis@Fresoncio:~/Temporal/ClientesActivos$ ./ClientesActivos-AP-N.sh 1
3
luis@Fresoncio:~/Temporal/ClientesActivos$ ./ClientesActivos-AP-N.sh 2
10
但它有点慢。 AP 3 示例:
luis@Fresoncio:~/Temporal/ClientesActivos$ time ./ClientesActivos-AP-N.sh 3
5
real 0m7.074s
user 0m0.040s
sys 0m0.040s
所以,只要我有超过 10 个 AP,我想并行化所有读数。我制作了另一个脚本,在背景中调用各个请求。比如:
AP-1=$(./ClientesActivos-AP-N.sh 1) &
AP-2=$(./ClientesActivos-AP-N.sh 2) &
AP-3=$(./ClientesActivos-AP-N.sh 3) &
... etc
sleep 20 # Wait 20 seconds for all readings to finish.
echo "$AP-1, $AP-2, $AP-3... etc"
但这似乎不起作用。至少在 shell 测试中:
luis@Fresoncio:~/Temporal/ClientesActivos$ echo $a
luis@Fresoncio:~/Temporal/ClientesActivos$ a=$(./ClientesActivos-AP-N.sh 4)
luis@Fresoncio:~/Temporal/ClientesActivos$ echo $a
6
luis@Fresoncio:~/Temporal/ClientesActivos$ unset a
luis@Fresoncio:~/Temporal/ClientesActivos$ echo $a
luis@Fresoncio:~/Temporal/ClientesActivos$ a=$(./ClientesActivos-AP-N.sh 4) &
[1] 13527
[A few minutes later...]
luis@Fresoncio:~/Temporal/ClientesActivos$ echo $a
[1]+ Done a=$(./ClientesActivos-AP-N.sh 4)
我做错了什么以及在 shell 脚本中并行化单行的方法是什么? 后台处理是正确的方法吗?
更多数据:
- 我的 shell 是 Bash,但通用答案也会很有用。
【问题讨论】:
-
让你的异步脚本写入文件而不是分配给变量(后者可能是不可能的)。
-
我也在考虑,@n.m。但这需要更多的编程(检查文件是否已经充满了数据,不仅是创建的而且是空的,等等),所以我想知道是否有更简单的方法。如果没有更好的方法,我会使用它。谢谢你。
-
不,让他们写入不同的文件,每个作业一个文件。
-
你的变量名
AP-1应该失败。先尝试一个简单的测试AP-1=xyz。我得到AP-1=xyz: not found [No such file or directory],而AP_1=xyz工作正常。关于并行和其他的其他建议看起来不错。祝你好运。 -
另外,我建议使用
wait而不是sleep。wait旨在处理后台任务。祝你好运。
标签: linux shell parallel-processing background-process