1

我的 Linux 服务器(Ubuntu 12.04 LTS)上有 3 个脚本,expA、expB 和 expC。然后,我得到了 32 个名为 nctu_0、nctu_1 ..... nctu_31 的输入文件。其中六个比其他的大得多,所以我将 3 个输入文件用于 expA,3 个用于 expB,另一个用于 expC。

即expA:运行nctu_6 nctu_13 nctu_17,expB:运行nctu_20 nctu_24 nctu_31,expC:运行其他文件

这里是expB的原始脚本,expA的脚本和expB差不多

#!/bin/bash
PROGRAM=./Simulator
FILE_PART_PREFIX1=/home//data/pcap_partial/h1200/nctu_
RESULT_PREFIX1=/home/data/setup_exp/h1200
RECEIVER_SIZE=4096
SENDER_SIZE=4096
BETA=0.25
UPDATE=400
MARKER=20
part=20
if [ ${part} -eq 20 ];then
nohup ${PROGRAM} 1 ${FILE_PART_PREFIX1}${part}.pcap ${RECEIVER_SIZE} ${SENDER_SIZE}    ${BETA} ${UPDATE} ${MARKER} ${MODE} >> ${RESULT_PREFIX1}/res_${part} 2>&1 &
fi
part=24
if [ ${part} -eq 24 ];then
nohup ${PROGRAM} 1 ${FILE_PART_PREFIX1}${part}.pcap ${RECEIVER_SIZE} ${SENDER_SIZE}   ${BETA} ${UPDATE} ${MARKER} ${MODE} >> ${RESULT_PREFIX1}/res_${part} 2>&1 &
fi
part=31
if [ ${part} -eq 31 ];then
nohup ${PROGRAM} 1 ${FILE_PART_PREFIX1}${part}.pcap ${RECEIVER_SIZE} ${SENDER_SIZE} ${BETA} ${UPDATE} ${MARKER} ${MODE} >> ${RESULT_PREFIX1}/res_${part} 2>&1 &
fi

我想先运行 nctu_20,然后在 nctu_24 完成后运行 nctu_24。最后在 nctu_24 完成后运行 nctu_31。


这是expC的原始脚本

#!/bin/bash
PROGRAM=./Simulator
FILE_PART_PREFIX1=/home/data/pcap_partial/h1200/nctu_
RESULT_PREFIX1=/home/data/setup_exp/h1200
RECEIVER_SIZE=4096
SENDER_SIZE=4096
BETA=0.25
UPDATE=400
MARKER=20
for (( part=0;part<32;part=part+1 ))
do
if [ ${part} -eq 6 ] || [ ${part} -eq 13 ] || [ ${part} -eq 17 ] || [ ${part} -eq 20 ] ||[ ${part} -eq 24 ] || [ ${part} -eq 31 ];then
continue
else
nohup ${PROGRAM} 1 ${FILE_PART_PREFIX1}${part}.pcap ${RECEIVER_SIZE} ${SENDER_SIZE} ${BETA} ${UPDATE} ${MARKER} ${MODE} >> ${RESULT_PREFIX1}/res_${part} 2>&1 &
fi
done

简而言之,我想同时运行 expA、expB expC,它们每个都在后台启动一个带有顺序输入文件的模拟器程序。有人能帮我吗?

4

1 回答 1

0

我不确定我是否理解你需要什么,但如果你想同时运行它们,我认为 bash 不能帮助你。您应该用其他一些支持线程的语言编写一个包装器,下面是 perl 中的示例:

#!/usr/bin/perl
use strict;
use warnings;
use threads;

sub start_simulator {
   my $simulator = shift;
   system("./$simulator");
}

my $thA = threads->create('start_simulator', 'expA');
$thA->detach();

my $thB = threads->create('start_simulator', 'expB');
$thB->detach();

my $thC = threads->create('start_simulator', 'expC');
$thC->detach();

exit 0;

将此包装器添加到您拥有 shell 脚本并使用./perl_wrapper.pl.

于 2012-09-10T20:47:54.920 回答