【问题标题】:Parallelizing lines (commands, processes...) on a Linux shell script在 Linux shell 脚本上并行化行(命令、进程...)
【发布时间】: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 而不是sleepwait 旨在处理后台任务。祝你好运。

标签: linux shell parallel-processing background-process


【解决方案1】:

最简单的方法是使用GNU Parallel

例子:

parallel ./ClientesActivos-AP-N.sh ::: $(seq 1 5)

【讨论】:

  • 一个强大的解决方案,谢谢。您可以添加参数,如./ClientesActivos-AP-N.sh -c -t 15 ::: $(seq 1 5)。谢谢你。
最近更新 更多