shell实战:子shell与后台运行

这段时间在运行仿真程序ns3,由于ns3是单线程,而我编写了三个路由算法进行对比,电脑CPU是八线程,于是在考虑能不能写一个脚本,同时运行三个程序,这样可以提高工作效率。(每个程序视数据量大小运行时间不等,但是普遍需要运行半个小时以上。)

于是,我开始研究shell脚本的编写。

首先梳理一下shell脚本需要实现什么功能:

1.创建一个以当前时间命名的文件夹,用于存放实验结果;

2.同时运行三个路由算法(即三个程序);

3.整理三个结果并上传到github。

一、以当前时间命名文件夹(子shell)

我们知道date命令可以获取当前系统时间,那么我们如何把date命令得到的结果重定向输出到shell变量中呢?

在shell中,()表示开启一个子shell,于是我利用子shell把date的输出赋值到shell的变量中,语句如下:

git_date=$(date)

git_date为shell中的变量,$(date)把date输出的结果复制给git_date。

二、同时运行三个程序

在shell中,同时运行多个程序,那么需要把部分程序放到后台中运行,这个时候,我们需要使用&符号,在执行程序的语句后面加上&,即可把程序放置后台运行(但是标准输出仍然显示在终端中),语句如下:

#后台运行ndn
./waf --run "nrndn_test --method=0" > ~/ndc-ns3-result/$file_name/ndn_record.txt &
#后台运行dis
sleep 4
./waf --run "nrndn_test --method=1" > ~/ndc-ns3-result/$file_name/dis_record.txt &
#后台运行cds
sleep 4
./waf --run "nrndn_test --method=2" > ~/ndc-ns3-result/$file_name/cds_record.txt &

我同时运行了三个程序,并且重定向输出到文件中。

其中,需要注意的是,我们需要监控后台运行的程序什么时候结束,这个时候需要使用wait命令,和unix中的多线程编程的waitpid类似。wait之后,在执行一些结果整理的命令。

三、整理并上传github

最后一步显得比较简单,使用cat命令合并一些实验结果,然后使用git命令上传到github。

 

下面为整个go.sh文件:

#!/bin/bash
#先去更新ndc-ns3-result文件夹
cd ~/ndc-ns3-result
git pull

#定义时间变量
git_date=$(date)
shell_date=$(date +%Y%m%d-%k%M%S)
file_name="result-"$shell_date

#输出shell_data
echo $file_name

mkdir ~/ndc-ns3-result/$file_name

cd ~/ndn/ns-3/
#先进行编译
./waf --run "nrndn_test --method=3"

#后台运行ndn
./waf --run "nrndn_test --method=0" > ~/ndc-ns3-result/$file_name/ndn_record.txt &
#后台运行dis
sleep 4
./waf --run "nrndn_test --method=1" > ~/ndc-ns3-result/$file_name/dis_record.txt &
#后台运行cds
sleep 4
./waf --run "nrndn_test --method=2" > ~/ndc-ns3-result/$file_name/cds_record.txt &

#等待后台程序结束
wait

#把结果合并输出到result.txt
cat ~/input/NR-NDN-Simulation/result.txt ~/input/CDS-Simulation/result.txt  ~/input/CDS-Simulation/result.txt > ~/ndc-ns3-result/$file_name/result.txt


cd ~/ndc-ns3-result
git add $file_name/ndn_record.txt
git add $file_name/dis_record.txt
git add $file_name/cds_record.txt
git add $file_name/result.txt

git commit -m "$git_date"
git push

#输出开始和结束时间
echo "开始时间:"$git_date
end_date=$(date)
echo "结束时间:"$end_date 
exit

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注