【发布时间】:2016-12-23 01:00:55
【问题描述】:
我已经在我们的一个主要脚本中实现了并行,以在服务器之间执行数据迁移。目前,输出以漂亮的颜色一次性呈现(-u),根据正在运行的序列(例如5/20: $username: rsyncing homedir或5/20: $username: restoring account),正在执行的函数的状态周期性回显。这些都直接回显到运行脚本的终端,并在那里累积。但是,根据命令运行的时间长度,输出可能会完全乱序,并且长时间运行的rsync 命令可能会在随机播放中丢失。但是我不想等待长时间运行的进程完成才能获得后续进程的输出。
简而言之,我的问题是跟踪哪些参数正在处理并且仍在运行。
我想做的是使用(parallel args command {#} {} ::: $userlist) & 将并行发送到后台,然后跟踪每个正在运行的函数的进度。我最初的想法是使用ps 和grep 以及tput 每隔几秒重写一次屏幕。我通常并行运行三个作业,所以我希望有一个屏幕显示,例如:
1/20: user1: syncing homedir
current file: /home/user1/www/cache/file12589015.php
12/20: user12: syncing homedir
current file: /home/user12/mail/joe/mailfile
5/20: user5: collecting information
current file:
我当然可以将上述状态输出放在一起没问题,但我目前的挂断是将来自各个并行进程的输出分成三个不同的......管道?变量?文件?这样就可以解析成上面的信息了。
【问题讨论】:
-
你知道 --linebuffer --tag 和 --tmux 吗?
-
--tag 如果有人对管道输出有想法以便可以定期分析它可能很有用(尽管当前输出显示所有参数已经整齐地格式化),但是 --line-buffer和 --tmux 在这种情况下没有帮助。我并不特别担心与输出重叠的行(这种情况很少见),从 tmux 而不是正在运行的进程中抓取信息似乎是一个额外的步骤(加上我们的机器默认没有安装 tmux)
标签: bash gnu-parallel