我想在Linux集群上使用bash脚本运行多个C ++代码。我能够这样做,但由于多个代码在群集上同时运行,因此变得很慢。因此,我想使用bash脚本运行这些模拟,以便下一个代码仅在前一个代码完成时才开始运行。
我现在一直在使用sleep命令,指定它可能会运行的小时数,但由于我不知道手头的运行时间效率非常低。下一个代码必须等到睡眠时间结束。
这是我当前的bash脚本的外观
#!/bin/bash
cd /home/Rectilinear_box_Loverl_16
make clean
make -f Makefile
echo "L/l = 16 started"
./Rod input_file.xml > log &
sleep 14h
echo "L/l = 16 completed"
cd /home/Rectilinear_box_Loverl_14
make clean
make -f Makefile
echo "\nL/l = 14 started"
./Rod input_file.xml > log &
sleep 14h
echo "L/l = 14 completed"
cd /home/Rectilinear_box_Loverl_12
make clean
make -f Makefile
echo "\nL/l = 12 started"
./Rod input_file.xml > log &
echo "L/l = 12 completed"
每个代码需要不同的时间才能完成,但我已指定了最长的安全时间。
有人可以建议一个好方法吗?
答案 0 :(得分:1)
删除&
。它们使您的计算在后台执行。
./Rod input_file.xml > log &
可以:
./Rod input_file.xml > log
答案 1 :(得分:0)
如果您不在后台运行程序,则在特定运行完成之前,它不会移动到下一个命令。
例如,删除睡眠命令并执行以下操作:
./Rod input_file.xml > log
而不是:
./Rod input_file.xml > log &
删除指示它应该运行的&符号。另外我建议把它放在顶部: 触摸日志
并使用>>
代替>
附加到日志。
答案 2 :(得分:0)
您可以启动后台进程(在此示例中sleep 5
是后台进程)并等待它。试试这个例子:
#!/bin/bash
# Do job #1
sleep 5 &
sleeppid=$!
# Wait for job #1 to finish
echo sleep started: $(date)
wait "$sleeppid"
echo sleep ended: $(date)
# Do job #2
sleep 5 &
sleeppid=$!
# Wait for job #2 to finish
echo sleep started: $(date)
wait "$sleeppid"
echo sleep ended: $(date)