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

Last change on this file since 136 was 136, checked in by rosiere, 15 years ago

1) Add new algo in ifetch queue
2) Add Cancel bit
3) new config

  • Property svn:keywords set to Id
File size: 4.8 KB
Line 
1#!/bin/bash
2
3#-----------------------------------------------------------
4# $Id: execute.sh 136 2009-10-20 18:52:15Z 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 NB_COMMAND=${#COMMAND[*]};
92    local -i x=${NB_COMMAND};
93
94    while test ${x} -ne 0; do
95        NB_DIGIT=$((${NB_DIGIT} + 1));
96        x=$((${x} / 10));
97    done;
98
99    echo "  * {"$(my_date)"} <${ID}> is ready";
100
101    # infinite loop
102    CPT_OLD=0;
103    CPT=0;
104
105    while test 1; do
106        # Take a number
107        CPT_OLD=${CPT};
108
109        # Read the index, and increase
110        lock   ${LOCK_CPT};
111        CPT=$(cat ${FILE_CPT});
112        echo "$((${CPT}+1))" > ${FILE_CPT};
113        unlock ${LOCK_CPT};
114
115        # test if this number is valid
116        if test ${CPT} -ge ${NB_COMMAND}; then
117            CPT=${NB_COMMAND};
118        fi;
119
120        # test if between the cpt_old and cpt, there are a synchronisation command
121
122#       local -i CPT_SYNC=${CPT}_OLD;
123#
124#       while test ${CPT}_SYNC -lt ${CPT}; do
125#           if test -z "${COMMAND[${CPT}_SYNC]}"; then
126#               echo "  * {"$(my_date)"} <${ID}> synchronisation [${CPT}_SYNC]";
127#           fi;
128#           CPT_SYNC=$((${CPT}_SYNC+1));
129#       done;
130
131        # test if this number is valid
132        if test ${CPT} -eq ${NB_COMMAND}; then
133            break;
134        fi;
135
136        # Test if command is empty !
137        if test ! -z "${COMMAND[${CPT}]}"; then
138            local NUM=$(printf %.${NB_DIGIT}d ${CPT});
139            local MAX=$((${NB_COMMAND}-1));
140
141#           echo "  * {"$(my_date)"} <${ID}> execute command [${NUM}] : ${COMMAND[${CPT}]}";
142            echo "  * {"$(my_date)"} <${ID}> command [${NUM}/${MAX}] : execute";
143            local PATH_CURRENT=${PWD};
144
145            cd    ${PATH_WORK}        &> /dev/null;
146            mkdir "Task_${NUM}"       &> /dev/null;
147            cd    "Task_${NUM}"       &> /dev/null;
148            echo "id   : ${ID}"        >  ${OUTPUT_FILE_INFO};
149            echo "host : ${HOSTNAME}" >>  ${OUTPUT_FILE_INFO};
150            echo "pid  : $$"          >>  ${OUTPUT_FILE_INFO};
151            echo "date : "$(my_date)  >>  ${OUTPUT_FILE_INFO};
152            echo "#!/bin/bash"         >  ${OUTPUT_FILE_CMD};
153            echo 'source ${HOME}/.bashrc;' >>  ${OUTPUT_FILE_CMD};
154            echo "${COMMAND[${CPT}]}" >>  ${OUTPUT_FILE_CMD};
155            chmod +x                      ${OUTPUT_FILE_CMD};
156            ./${OUTPUT_FILE_CMD}      &${OUTPUT_FILE_OUT};
157            cd    ${PATH_CURRENT}     &> /dev/null;
158            echo "  * {"$(my_date)"} <${ID}> command [${NUM}/${MAX}] : done";
159        fi;
160    done;
161
162    echo "  * {"$(my_date)"} <${ID}> is done";
163
164    lock   ${LOCK_CPU};
165    CPT=$(cat ${FILE_CPU});    # read  the      index
166    CPT=$((${CPT}-1));
167    echo "${CPT}" > ${FILE_CPU}; # write the next index
168    unlock ${LOCK_CPU};
169   
170    if test ${CPT} -eq 0; then
171        echo "  * {"$(my_date)"} <${ID}> All task is executed on this host";
172        rm ${FILE_CPU};
173    fi;
174}
175
176#-----[ Corps ]---------------------------------------------
177execute ${*};
Note: See TracBrowser for help on using the repository browser.