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
RevLine 
[85]1#!/bin/bash
2
[82]3#-----------------------------------------------------------
4# $Id: execute.sh 127 2009-06-17 21:21:10Z rosiere $
5#-----------------------------------------------------------
[2]6
[112]7#-----[ global variable ]-----------------------------------
[78]8
[2]9#-----[ lock ]----------------------------------------------
10function lock ()
11{
[112]12    lockfile -1 ${1};
[2]13}
14
15#-----[ unlock ]--------------------------------------------
16function unlock ()
17{
[112]18    rm -f ${1};
[2]19}
20
[112]21#-----[ my_date ]-------------------------------------------
22function my_date ()
[2]23{
[112]24    date +"%F %T";
25}
[2]26
[112]27#-----[ execute_usage ]-------------------------------------
28function execute_usage ()
29{
[124]30    echo "Usage     : ${0} path_work file_cmd file_cpt file_cpu id";
[112]31    echo "Arguments : ";
[124]32    echo " * path_work  : directory to execute command";
[112]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";
[124]36    echo " * id         : identification";
[112]37    exit;
38}
39
40#-----[ execute_test_usage ]--------------------------------
41function execute_test_usage ()
42{
[124]43    if test ${#} -ne 5; then
[112]44        execute_usage;
[2]45    fi;
46
[112]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;
[124]61    local    PATH_WORK=${1};
[112]62    local    FILE_CMD=${2};
63    local    FILE_CPT=${3};
64    local    FILE_CPU=${4};
[124]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";
[112]71
[124]72#   echo "  * {"$(my_date)"} <${ID}> pid is $$";
[112]73
74    # Init CPT if this thread is the first
75    lock   ${LOCK_CPT};
76    if test ! -s ${FILE_CPT}; then
[124]77        echo "  * {"$(my_date)"} <${ID}> create counter file ${FILE_CPT}";
[112]78        echo "0" > ${FILE_CPT};
79    fi;
80    unlock ${LOCK_CPT};
81
82    # read, line by line, the command file and write in array
[2]83    CPT=0;
84
85    while read line; do
[112]86        COMMAND[${CPT}]="${line}";
87        CPT=$((${CPT}+1));
88    done < ${FILE_CMD};
[2]89
[127]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
[124]98    echo "  * {"$(my_date)"} <${ID}> is ready";
[2]99
100    # infinite loop
101    CPT_OLD=0;
102    CPT=0;
103
104    while test 1; do
105        # Take a number
[112]106        CPT_OLD=${CPT};
[2]107
[112]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};
[2]113
[124]114        # test if this number is valid
[112]115        if test ${CPT} -ge ${#COMMAND[*]}; then
[2]116            CPT=${#COMMAND[*]};
117        fi;
118
119        # test if between the cpt_old and cpt, there are a synchronisation command
120
[112]121#       local -i CPT_SYNC=${CPT}_OLD;
[2]122#
[112]123#       while test ${CPT}_SYNC -lt ${CPT}; do
124#           if test -z "${COMMAND[${CPT}_SYNC]}"; then
[124]125#               echo "  * {"$(my_date)"} <${ID}> synchronisation [${CPT}_SYNC]";
[2]126#           fi;
[112]127#           CPT_SYNC=$((${CPT}_SYNC+1));
[2]128#       done;
129
130        # test if this number is valid
[112]131        if test ${CPT} -eq ${#COMMAND[*]}; then
[2]132            break;
133        fi;
134
135        # Test if command is empty !
[112]136        if test ! -z "${COMMAND[${CPT}]}"; then
[127]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";
[124]141            local PATH_CURRENT=${PWD};
[127]142
[124]143            cd    ${PATH_WORK}        &> /dev/null;
[127]144            mkdir "Task_${NUM}"       &> /dev/null;
145            cd    "Task_${NUM}"       &> /dev/null;
[124]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;
[127]156            echo "  * {"$(my_date)"} <${ID}> command [${NUM}] : done";
[2]157        fi;
158    done;
159
[124]160    echo "  * {"$(my_date)"} <${ID}> is done";
[2]161
[112]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};
[2]167   
[112]168    if test ${CPT} -eq 0; then
[124]169        echo "  * {"$(my_date)"} <${ID}> All task is executed on this host";
[112]170        rm ${FILE_CPU};
[2]171    fi;
172}
173
174#-----[ Corps ]---------------------------------------------
[112]175execute ${*};
Note: See TracBrowser for help on using the repository browser.