LINUX.ORG.RU

Проблема со bash скриптом


0

0

Есть программа, которая выполняет расчеты и может долго работать. Если есть несколько заданий для этой программы, то нужно автоматизировать их запуск. Написал я run.sh вот такой например:

#!/bin/sh ./prog t1.inp t1.log rm temp.log rm -rf /scratch/prog.0 rm -rf /scratch/prog.1 rm -rf /scratch/prog.2 rm -rf /scratch/prog.3 ./prog t2.inp t2.log rm temp.log rm -rf /scratch/prog.0 rm -rf /scratch/prog.1 rm -rf /scratch/prog.2 rm -rf /scratch/prog.3

И-за того, что программа создает временные файлы и диры, все это нужно удалять после каждого расчта, поэтому стоят rm. Но возникает проблема, я запускаю run.sh & и после первого расчета (пара часов) временный мусор не удаляется и второй расчет на запускается. Если же расчеты очень короткие (секунды), то все работает нормально. С чем это связано и как это можно побороть?

anonymous

update

если ставить sleep 15s после каждого расчета и перед удалением файлов - то иногда помогает, то не всегда. :(

anonymous
()

Здесь, вроде, всё нормально. Может быть, программа порождает процесс, пишущий временные файлы, и возвращает управление до его завершения. Тогда этот процесс создаёт эти файлы заново после их удаления. Соответственно, иногда 15 секунд хватает для его завершения, иногда - нет. Проверить наличие лишних процессов можно с помощью программы ps, вызвав её перед rm-ами

Jini ★★
()
Ответ на: комментарий от anonymous

Ну можно предположить, что программа порождает другие процессы и не ждет их завершения,
а для этих процессов рабочим каталогом является один из этих временных, поэтому его и не удается удалить.
Конечно, это при условии , что на эти каталоги выставлены достаточные для удаления права...

Для начала можно попробовать запустить: 

#!/bin/bash
./prog t1.inp t1.log
lsof +d /scratch/ > /tmp/lsof.rez.txt
ps axfuwww > /tmp/ps.rez.txt

потом посмотреть файлы /tmp/lsof.rez.txt, /tmp/ps.rez.txt и решить как действовать...

Может можно тупо пытаться удалить каталог пока не удалится. Наподобие:

#!/bin/bash
DLST="temp.log; /scratch/prog.0; /scratch/prog.1; /scratch/prog.2; /scratch/prog.3"
./prog t1.inp t1.log
F=1
while [ $F == 1 ] ; do
  F=0 
  for D in $DLST; do
     rm -rf $D
     [ -a $D ] && F=1
  done
  [ $F == 1 ] && sleep 10
done

./prog t2.inp t2.log
Аналогичные цикл удаления

mky ★★★★★
()
Ответ на: комментарий от mky

>для этих процессов рабочим каталогом является один из этих временных, поэтому его и не удается удалить

Ядро 2.6.17, все прекрасно удаляется, даже если есть открытые файлы и текущим каталогом является удаляемый. Может это все в cygwin или msys на венде происходит? Либо как была версия выше заново создаются.

Dr_ZLO
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.