The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Помогите подправить скрипт..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Помогите подправить скрипт..."  
Сообщение от twinsen email(ok) on 21-Май-07, 04:03 
Вот на досуге написал небольшой скрипт...
Код:
#!/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
        fi

        tar "czf" "$file"."tar.gz" $file
        `rm -f $file`

done
exit 0

Но это не совсем что требуется...как оказалось...
Т.е. скрипт помещен в кронтаб... запускается он раз в час... за час в дире data создаются около 20 файлов *.avi , но дело в том, что приложение, которое создает и пишет эти файлы, все время работает... работает оно так:
1. Создает файл *.avi
2. Начинает в него писать информацию, на протяжении нескольких минут.
3. После, сохраняет файл и возвращается к 1-ому пункт...
И получается когда запускается этот скрипт, он захватывает один из нескольких недописанных файлов, что не есть хорошо... т.е. само собой прога пишет файл, и тут подхвачивает его тар, и начинает запаковывать, после удаляет... ну естесно, программа прерывается, и начинает другой файл писать, а тот, что в архиве получается остается поврежденным...

Не кто не подскажет, как можно скриптик переписать так, чтоб тот файл, в котором, в данный момент, напрм. изменяется размер, пропускал его?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "Помогите подправить скрипт..."  
Сообщение от Doka (??) on 21-Май-07, 07:42 
>Вот на досуге написал небольшой скрипт...
>Код:
>#!/bin/bash
># Ok, so let's  go....
>
>Не кто не подскажет, как можно скриптик переписать так, чтоб тот файл,
>в котором, в данный момент, напрм. изменяется размер, пропускал его?

есть масса вариантов
например
1 приложение пишет в файл current.tmp и по закрытие переименовывает его в avi.
2 смотрите размер avi файла до компрессии и сравниваете его по окончании,
если размеры совпадают удаляете avi - нет удаляете tar.gz.

PS это как же вы кодируете видео, что имеет смысл сжимать его gzip-ом !?


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Помогите подправить скрипт..."  
Сообщение от twinsen email(ok) on 21-Май-07, 21:14 
>есть масса вариантов
>например
>1 приложение пишет в файл current.tmp и по закрытие переименовывает его в
>avi.
>2 смотрите размер avi файла до компрессии и сравниваете его по окончании,
>
>если размеры совпадают удаляете avi - нет удаляете tar.gz.
>
>PS это как же вы кодируете видео, что имеет смысл сжимать его
>gzip-ом !?

да пробовал так делать, но не получалось..нет опыта в скриптинге (. а вообще файлы не видео формата... просто расширение такое же.. gzip этот файл сжимает в три раза...


andy огромное спасибо за скрипт!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Помогите подправить скрипт..."  
Сообщение от andy email(??) on 21-Май-07, 11:37 
я так понял, что писалкой авишников управлять нельзя? Тогда 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/bash

DATADIR='/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: делалось второпях, поэтому может не все учел

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Помогите подправить скрипт..."  
Сообщение от andy email(??) on 21-Май-07, 12:48 
как проверял непонятно....
строку
   if [[ -r $file ]]
поменять на
   if [[ ! -r $file ]]
конечно же.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Помогите подправить скрипт..."  
Сообщение от perece on 22-Май-07, 10:18 
>PS: lsof не везде по умолчанию ставится, возможно, придется доставить
это во первых. а во вторых fuser для этой задачи всеж уместнее даже при наличии lsof
(скрипт с использованием fuser писать влом ибо кто первый того и тапки все равно)

\^P^/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Помогите подправить скрипт..."  
Сообщение от andy email(??) on 22-Май-07, 10:26 
согласен с perece, fuser будет лучше.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру