source: trunk/IPs/systemC/processor/Morpheo/Script/execute.sh @ 127

Last change on this file since 127 was 127, checked in by rosiere, 15 years ago
  • Property svn:keywords set to Id
File size: 4.7 KB
Line 
1#!/bin/bash
2
3#-----------------------------------------------------------
4# $Id: execute.sh 127 2009-06-17 21:21:10Z rosiere $
5#-----------------------------------------------------------
6
7#-----[ global variable ]-----------------------------------
8
9#-----[ lock ]----------------------------------------------
10function lock ()
11{
12    lockfile -1 ${1};
13}
14
15#-----[ unlock ]--------------------------------------------
16function unlock ()
17{
18    rm -f ${1};
19}
20
21#-----[ my_date ]-------------------------------------------
22function my_date ()
23{
24    date +"%F %T";
25}
26
27#-----[ execute_usage ]-------------------------------------
28function execute_usage ()
29{
30    echo "Usage     : ${0} path_work file_cmd file_cpt file_cpu id";
31    echo "Arguments : ";
32    echo " * path_work  : directory to execute command";
33    echo " * file_cmd   : list of command";
34    echo " * file_cpt   : file with the index of next command to execute";
35    echo " * file_cpu   : tmp file to stock the current index";
36    echo " * id         : identification";
37    exit;
38}
39
40#-----[ execute_test_usage ]--------------------------------
41function execute_test_usage ()
42{
43    if test ${#} -ne 5; then
44        execute_usage;
45    fi;
46
47    if test ! -d ${1}; then
48        echo "Directory ${1} is invalid";
49    fi;
50}
51
52#-----[ execute ]-------------------------------------------
53function execute ()
54{
55    # test_usage
56    execute_test_usage ${*};
57
58    local -a COMMAND;
59    local -i CPT_OLD;
60    local -i CPT;
61    local    PATH_WORK=${1};
62    local    FILE_CMD=${2};
63    local    FILE_CPT=${3};
64    local    FILE_CPU=${4};
65    local    ID=${5};
66    local    LOCK_CPT="${PATH_WORK}/.lock-cpt";
67    local    LOCK_CPU="${PATH_WORK}/.lock-cpu";
68    local    OUTPUT_FILE_INFO="distexe.info";
69    local    OUTPUT_FILE_CMD="distexe.command";
70    local    OUTPUT_FILE_OUT="distexe.output";
71
72#   echo "  * {"$(my_date)"} <${ID}> pid is $$";
73
74    # Init CPT if this thread is the first
75    lock   ${LOCK_CPT};
76    if test ! -s ${FILE_CPT}; then
77        echo "  * {"$(my_date)"} <${ID}> create counter file ${FILE_CPT}";
78        echo "0" > ${FILE_CPT};
79    fi;
80    unlock ${LOCK_CPT};
81
82    # read, line by line, the command file and write in array
83    CPT=0;
84
85    while read line; do
86        COMMAND[${CPT}]="${line}";
87        CPT=$((${CPT}+1));
88    done < ${FILE_CMD};
89
90    local -i NB_DIGIT=0;
91    local -i x=${#COMMAND[*]};
92
93    while test ${x} -ne 0; do
94        NB_DIGIT=$((${NB_DIGIT} + 1));
95        x=$((${x} / 10));
96    done;
97
98    echo "  * {"$(my_date)"} <${ID}> is ready";
99
100    # infinite loop
101    CPT_OLD=0;
102    CPT=0;
103
104    while test 1; do
105        # Take a number
106        CPT_OLD=${CPT};
107
108        # Read the index, and increase
109        lock   ${LOCK_CPT};
110        CPT=$(cat ${FILE_CPT});
111        echo "$((${CPT}+1))" > ${FILE_CPT};
112        unlock ${LOCK_CPT};
113
114        # test if this number is valid
115        if test ${CPT} -ge ${#COMMAND[*]}; then
116            CPT=${#COMMAND[*]};
117        fi;
118
119        # test if between the cpt_old and cpt, there are a synchronisation command
120
121#       local -i CPT_SYNC=${CPT}_OLD;
122#
123#       while test ${CPT}_SYNC -lt ${CPT}; do
124#           if test -z "${COMMAND[${CPT}_SYNC]}"; then
125#               echo "  * {"$(my_date)"} <${ID}> synchronisation [${CPT}_SYNC]";
126#           fi;
127#           CPT_SYNC=$((${CPT}_SYNC+1));
128#       done;
129
130        # test if this number is valid
131        if test ${CPT} -eq ${#COMMAND[*]}; then
132            break;
133        fi;
134
135        # Test if command is empty !
136        if test ! -z "${COMMAND[${CPT}]}"; then
137            local NUM=$(printf %.${NB_DIGIT}d ${CPT});
138
139#           echo "  * {"$(my_date)"} <${ID}> execute command [${NUM}] : ${COMMAND[${CPT}]}";
140            echo "  * {"$(my_date)"} <${ID}> command [${NUM}] : execute";
141            local PATH_CURRENT=${PWD};
142
143            cd    ${PATH_WORK}        &> /dev/null;
144            mkdir "Task_${NUM}"       &> /dev/null;
145            cd    "Task_${NUM}"       &> /dev/null;
146            echo "id   : ${ID}"        >  ${OUTPUT_FILE_INFO};
147            echo "host : ${HOSTNAME}" >>  ${OUTPUT_FILE_INFO};
148            echo "pid  : $$"          >>  ${OUTPUT_FILE_INFO};
149            echo "date : "$(my_date)  >>  ${OUTPUT_FILE_INFO};
150            echo "#!/bin/bash"         >  ${OUTPUT_FILE_CMD};
151            echo 'source ${HOME}/.bashrc;' >>  ${OUTPUT_FILE_CMD};
152            echo "${COMMAND[${CPT}]}" >>  ${OUTPUT_FILE_CMD};
153            chmod +x                      ${OUTPUT_FILE_CMD};
154            ./${OUTPUT_FILE_CMD}      &${OUTPUT_FILE_OUT};
155            cd    ${PATH_CURRENT}     &> /dev/null;
156            echo "  * {"$(my_date)"} <${ID}> command [${NUM}] : done";
157        fi;
158    done;
159
160    echo "  * {"$(my_date)"} <${ID}> is done";
161
162    lock   ${LOCK_CPU};
163    CPT=$(cat ${FILE_CPU});    # read  the      index
164    CPT=$((${CPT}-1));
165    echo "${CPT}" > ${FILE_CPU}; # write the next index
166    unlock ${LOCK_CPU};
167   
168    if test ${CPT} -eq 0; then
169        echo "  * {"$(my_date)"} <${ID}> All task is executed on this host";
170        rm ${FILE_CPU};
171    fi;
172}
173
174#-----[ Corps ]---------------------------------------------
175execute ${*};
Note: See TracBrowser for help on using the repository browser.