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

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

modif distexe script

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