Вот на досуге написал небольшой скрипт...
Код:
#!/bin/bash
# Ok, so let's go....# SETTING
FILES="*.avi"
PWD="/home/data/"
# ENGINE
cd $PWD
for file in $FILES
do
if [ ! -e "$file" ]
then
echo "I can't find any file..."
continue
fitar "czf" "$file"."tar.gz" $file
`rm -f $file`done
exit 0Но это не совсем что требуется...как оказалось...
Т.е. скрипт помещен в кронтаб... запускается он раз в час... за час в дире data создаются около 20 файлов *.avi , но дело в том, что приложение, которое создает и пишет эти файлы, все время работает... работает оно так:
1. Создает файл *.avi
2. Начинает в него писать информацию, на протяжении нескольких минут.
3. После, сохраняет файл и возвращается к 1-ому пункт...
И получается когда запускается этот скрипт, он захватывает один из нескольких недописанных файлов, что не есть хорошо... т.е. само собой прога пишет файл, и тут подхвачивает его тар, и начинает запаковывать, после удаляет... ну естесно, программа прерывается, и начинает другой файл писать, а тот, что в архиве получается остается поврежденным...Не кто не подскажет, как можно скриптик переписать так, чтоб тот файл, в котором, в данный момент, напрм. изменяется размер, пропускал его?
>Вот на досуге написал небольшой скрипт...
>Код:
>#!/bin/bash
># Ok, so let's go....
>
>Не кто не подскажет, как можно скриптик переписать так, чтоб тот файл,
>в котором, в данный момент, напрм. изменяется размер, пропускал его?есть масса вариантов
например
1 приложение пишет в файл current.tmp и по закрытие переименовывает его в avi.
2 смотрите размер avi файла до компрессии и сравниваете его по окончании,
если размеры совпадают удаляете avi - нет удаляете tar.gz.PS это как же вы кодируете видео, что имеет смысл сжимать его gzip-ом !?
>есть масса вариантов
>например
>1 приложение пишет в файл current.tmp и по закрытие переименовывает его в
>avi.
>2 смотрите размер avi файла до компрессии и сравниваете его по окончании,
>
>если размеры совпадают удаляете avi - нет удаляете tar.gz.
>
>PS это как же вы кодируете видео, что имеет смысл сжимать его
>gzip-ом !?да пробовал так делать, но не получалось..нет опыта в скриптинге (. а вообще файлы не видео формата... просто расширение такое же.. gzip этот файл сжимает в три раза...
andy огромное спасибо за скрипт!
я так понял, что писалкой авишников управлять нельзя? Тогда lsof вам в руки. Идея - смотреть, открыт файл или нет. Если он открыт каким-либо процессом, то жать/удалять его нельзя. Если свободен, то он наш. В примере файл 1.txt открыт в другой сессии less`ом.[admin@ifs-new shell]$ ls -l
итого 8
-rw-r--r-- 1 admin wheel 4 Май 21 15:01 1.txt
-rw-r--r-- 1 admin wheel 0 Май 21 15:21 2.txt
--w------- 1 admin wheel 0 Май 21 15:21 3.txt
-rwxr-xr-x 1 admin wheel 544 Май 21 15:27 grownfile.sh
[admin@ifs-new shell]$
[admin@ifs-new shell]$ cat ./grownfile.sh
#!/bin/bashDATADIR='/home/admin/tests/shell'
FILTER='*.txt'for file in `find $DATADIR -name "$FILTER" -print `
do
do_action=0
/usr/sbin/lsof $file >/dev/null 2>&1
if [[ $? == 1 && -f $file ]]
then
if [[ -r $file ]]
then
state="SKIP (free, but can not open for reading)"
else
state="PROC (free)"
do_action=1
fi
else
state="SKIP (opened)"
fi
echo "$file : $state"if [[ $do_action == 1 ]]
then
# ... zip ...
# ... del ...
# ... ... ...
echo "$file : OK"
fi
done[admin@ifs-new shell]$ ./grownfile.sh
/home/admin/tests/shell/1.txt : SKIP (opened)
/home/admin/tests/shell/2.txt : SKIP (free, but can not open for reading)
/home/admin/tests/shell/3.txt : PROC (free)
/home/admin/tests/shell/3.txt : OK
[admin@ifs-new shell]$PS: lsof не везде по умолчанию ставится, возможно, придется доставить
PPS: делалось второпях, поэтому может не все учел
как проверял непонятно....
строку
if [[ -r $file ]]
поменять на
if [[ ! -r $file ]]
конечно же.
>PS: lsof не везде по умолчанию ставится, возможно, придется доставить
это во первых. а во вторых fuser для этой задачи всеж уместнее даже при наличии lsof
(скрипт с использованием fuser писать влом ибо кто первый того и тапки все равно)\^P^/
согласен с perece, fuser будет лучше.