2016-02-08 2 views
0

У меня есть сценарий bash, который запускает несколько экспериментов (время реализации и т. Д.), Но я не хочу запускать тот же эксперимент, если он уже запущен.Bash: проверить, запущен ли скрипт на этом компьютере

Эксперимент уже запущен, если такой же компьютер создал выходной файл, содержащий 280 строк.

Что мне теперь делать, состоит в следующем (для всех экспериментов):

# Remove the prefix 
tmp=${3#*/} 
# Remove the suffix 
instance=${tmp%.*} 
# Set the output path 
output_path=statistics/experiment-$1-$2-${instance}.csv 
if [ -f ${output_path} ]; 
then 
    # The output file exists, check if it contains 280 lines 
    LC=`wc -l ${output_path} | cut -f1 -d' '` 
    if [[ ${LC} == 280 ]]; then 
     # It did, thus we are done 
     echo "$(date -R) [SKIPPING ] Instance already processed for ${1} (${2}) on ${3} - Skipping experiment!" 
     # Do not do anything else 
     exit 0 
    fi 
    # The experiment was stopped prematurely, rerun it 
    echo "$(date -R) [RERUNNING] Instance not fully processed for ${1} (${2}) on ${3} - Rerunning experiment! (${LC}/280 runs)" 
    # Remove old file 
    rm -f ${output_path} 
fi 
# Run the experiment 
echo "$(date -R) [RUNNING ] Running experiment for ${1} (${2}) on ${3}" 
start=$(date +%s) 
./bin/Experiment --algorithm $1 --dbms $2 --instance_path $3 > ${output_path} 
total=$(($(date +%s)-${start})) 
echo "$(date -R) [FINISHED ] Finished experiment for ${1} (${2}) on ${3} in ${total} seconds." 

Но это вовсе не чек, если эксперимент работал на том же компьютере. Первоначально я хотел использовать ip link show eth0 | awk '/ether/ {print $2}', чтобы получить MAC-адрес компьютера, а затем сохранить выходной файл в каталоге, например. statistics/ff:ff:ff:ff:ff/experiment1.csv, но (при условии, что установлен ip) гарантировано ли, что указанная команда вернет MAC-адрес? Или есть другие способы однозначно идентифицировать компьютер из bash-скрипта?

+1

Возможно, вы можете использовать имя хоста вместо IP-адреса или MAC-адреса? – Pierre

+0

Я думаю, что для моего варианта использования этого должно быть достаточно! – YnkDK

ответ

0

dmidecode. Он проверяет систему и возвращает серийный номер, установленный изготовителем. У вас есть несколько вариантов. Вы можете использовать dmidecode -t 2, который возвращает что-то вроде:

  Handle 0x0002, DMI type 2, 8 bytes. Base Board Information 
      Manufacturer: Intel 
      Product Name: C440GX+ 
      Version: 727281-001 
      Serial Number: INCY92700942 

В приведенном выше примере, вы можете увидеть серийный номер материнской платы, но не системы. Для этого вы можете использовать dmidecode -t 1. Это может быть хлопот, чтобы разобрать все, что так просто проложить его через sha256sum и получить простой хеш.

Использование dmidecode -s system-uuid также может быть полезно.

Смежные вопросы