在 Linux shell 脚本中,如果达到某个时间限制,我想使用timeout命令来结束另一个命令。一般来说:
timeout -s SIGTERM 100 command
Run Code Online (Sandbox Code Playgroud)
但我也希望我的 shell 脚本在命令由于某种原因失败时退出。如果命令失败得足够早,则不会达到时间限制,超时将以退出代码 0 退出。因此无法使用trap或set -e捕获错误,至少我已经尝试过了,但它不起作用。我怎样才能实现我想做的事?
我有一个非常大的文本文件(大约20 GB和3亿行),其中包含由制表符分隔的三列:
word1 word2 word3
word1 word2 word3
word1 word2 word3
word1 word2 word3
Run Code Online (Sandbox Code Playgroud)
word1,word2和word3在每一行中都不同.word3指定行的类,并经常为不同的行重复(具有数千个不同的值).目标是通过行类(word3)分隔文件.即word1和word2应该存储在一个名为word3的文件中,用于所有行.例如,对于该行:
a b c
Run Code Online (Sandbox Code Playgroud)
字符串"a b"应该附加到名为c的文件中.
现在我知道如何使用while循环,逐行读取文件,并为每一行附加适当的文件:
while IFS='' read -r line || [[ -n "$line" ]]; do
# Variables
read -a line_array <<< ${line}
word1=${line_array[0]}
word2=${line_array[1]}
word3=${line_array[2]}
# Adding word1 and word2 to file word3
echo "${word1} ${word2}" >> ${word3}
done < "inputfile"
Run Code Online (Sandbox Code Playgroud)
它工作,但速度很慢(即使我有一个带SSD的快速工作站).怎么加速?我已经尝试在/ dev/shm中执行此过程,并将文件拆分为10个并且为每个文件并行运行上面的脚本.但它仍然很慢.有没有办法进一步加快速度?
我有许多bash脚本执行很多类似的任务,他们使用一些外部二进制程序.问题是二进制程序通常不会像它们应该那样终止.由于我的脚本运行了数千次,因此很快发生这些进程的许多空闲/接近死亡的实例正在累积.我无法修复这些程序,因此我需要确保我的bash脚本正在终止它们.
SE中有一些主题已经处理了终止bash脚本过程的任务.我已经应用并测试了那里写的内容,并且在某种程度上它起作用了.但它对我的情况不起作用,我不明白为什么,因此我开了一个新问题.
我的脚本有一个层次结构,这里以简化的方式显示:脚本A调用脚本B,脚本B并行调用脚本C的多个实例以使用所有CPU.例如,脚本B并行运行脚本C的5个实例,当脚本C的一个实例完成时,它启动一个新的脚本C,总共运行数千个脚本C.脚本C调用几个不能很好地终止的外部二进制文件/命令.它们在后台并行并相互通信.
但是,我的脚本C能够检测外部命令何时完成其工作,即使它们尚未终止,然后我的bash脚本退出.
为了在完成bash脚本期间终止所有外部程序,我添加了一个退出陷阱:
# Exit cleanup
cleanup_exit() {
# Running the termination in an own process group to prevent it from preliminary termination. Since it will run in the background it will not cause any delays
setsid nohup bash -c "
touch /tmp/trace_1 # To see if this code was really executed to this point
# Trapping signals to prevent that this function is terminated preliminary
trap '' SIGINT SIGQUIT SIGTERM SIGHUP ERR
touch /tmp/trace_2 # To see …Run Code Online (Sandbox Code Playgroud) 我们有数百万个小文件要由某些程序处理。
精确的计划并不重要,变化也与精确的任务。然而,这些是较小的 C++ 程序,我们有源代码,但它们本质上是不可并行的。
使用单个平均 CPU 内核(Intel i7 系列)时,处理一个小文件大约需要 15 秒。并且在程序运行时它需要大约 200 MB 的 RAM。
我们希望在 GPU 上并行化,并在每个 GPU 核心(例如 Cuda 核心)上运行一个程序实例。因此,如果 GPU 有 3000 个 CUDA 核心,那么我们希望并行运行 3000 个实例。如果可能,我们希望使用像 OpenCL 这样的通用框架(而不是 Cuda,但如果在这种情况下需要 Cuda,那将是可以接受的)。
现在我们正在尝试评估这是否可行(我们在 GPGPU 编程方面还没有太多经验)。我们想象的主要问题是记忆。如果我们并行运行 3000 个实例,每个实例需要 200 MB VRAM,那么我们需要 600 GB 内存。
我们主要考虑的显卡是高端 Geforce 卡,通常具有 8 GB 到 11 GB 的内存。我们有每个机箱/主板有 4 个卡的 GPU 工作站,我们一开始想用它(但后来也可能在其他 GPU 系统上,因此我们更喜欢像 OpenCL 这样的通用框架)。
有哪些方法可以解决这个问题?