我开发了一个由两个文件组成的代码:一个“信封 bash 文件”,它做一些事情并写入一个日志文件,然后在某个时候运行到一个 for 循环中,它在其中执行一项工作一次使用 bsub。和“一个内部 bash 文件”,它获取日志文件的名称作为输入(除了其执行所需的其他输入值),并执行进程 X(使用它从“信封文件”接收到的输入值. 一旦进程 X 完成,“内部脚本”将进程 X(及其特定序列号)写入日志文件。
由于信封文件的 for-loop 循环了 10 次,因此至少有 10 个并行进程正在执行并并行运行,并且它们都在给定相同的日志文件名的情况下使用 bsub 执行。这个想法是,一旦他们完成了 Process X 的执行,他们都会向同一个日志文件报告。
一般过程运行良好,并且在每种情况下都在执行进程 X,并且日志文件根据需要累积有关进程 X 完成的所有通知。但是,在某些情况下,我们看到写入日志文件得到两条平行运行的干扰线和输出线相互碰撞。
我想以允许它一次仅从一个并行运行接收文本的方式锁定日志文件。这个想法是为了避免由于两个进程恰好同时写入日志文件而导致文本混合的情况。
这是我的信封文件中调用 bsub 的部分(我将内容减少到最低限度):
for ((i=1;i<=$batchesnumber; i++));
do
bsub -J $SerialName -q normal "bash FetchFasta.bash $genome_fa ${SerialFileName}".bed" $logfile"
done
这是我的内部文件中回显到日志文件的部分:
(
echo "~~~~~~~~~~~~~~~~~~"
echo "^^^^^^^^^^^^^^^^^^"
echo -n "Completed running "; bedtools -version
echo "bedtools getfasta -s -fi $genome_fasta -bed $mySerialFile -fo ${mySerialFile%.*}".fa" "
echo "Run's completion time is: $timedate"
echo -e "~~~~~~~~~~~~~~~~~~\n"
) >> $logfile
我将不胜感激任何有用的解决方案!