Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: BASH. Продолжить выполнение когда файл будет свободен.  (Прочитано 1427 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6747
  • Ubuntu 16.04
    • Просмотр профиля
Нужно написать скрипт для сжатия аудиозаписи из астериска после того как файл освободится. Сложность в том, что файл освобождается позже чем срабатывает exten=>h в связи с переводом звонка на другой канал, при этом запись продолжается и после перевода благодаря использованию AUDIOHOOK_INHERIT(MixMonitor)=yes. Ближе к задаче, из астериска вызывается сторонний скрипт с помощью приложения System(), вызывается он в тот момент когда срабатывает отбой exten=>h, т.е. до того, как завершится запись. Нужно дождаться освобождения файла и сжать его.

Сделал следующим образом:

#!/bin/bash

sleep 5
while [ `fuser $1` ]
do
  sleep 5
done

oggenc $1 -Q -q 0 -o $2
rm -f $1

1-й sleep 5 на всякий случай, запас. Если тестить в ручную, то все вроде работает, скрипт ждет пока fuser не вернет пустую строку. Но когда подставляю в астериск, получаю, что первый sleep 5 отрабатывает, а до 2-го дело не доходит, это видно, если параллельно смотреть fuser.

/var/spool/asterisk/monitor/2014-12-04__10-58-57__....wav:  1359
root@asterisk-dk:/var/spool/asterisk/monitor# fuser 2014-12-04__10-58-57__....wav
/var/spool/asterisk/monitor/2014-12-04__10-58-57__....wav:  1359
root@asterisk-dk:/var/spool/asterisk/monitor# fuser 2014-12-04__10-58-57__....wav
Указанное имя файла 2014-12-04__10-58-57__....wav не существует.
root@asterisk-dk:/var/spool/asterisk/monitor# fuser 2014-12-04__10-58-57__....wav
Указанное имя файла 2014-12-04__10-58-57__....wav не существует.

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
1. Все переменные лучше экранировать.
2. Синтаксис можно упростить:
while fuser "$1"
do
  sleep 5
done
3. Отладка скрипта:
set -x4. Скрипт работает под каким-то юзером.
У этого юзера должны быть права на доступ к файлу.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6747
  • Ubuntu 16.04
    • Просмотр профиля
привел к такому виду

#!/bin/bash

sleep 5

while fuser "$1"
do
  sleep 5
done

oggenc "$1" -Q -q 0 -o "$2"
rm "$1"

скрипт работает под юзером asterisk, этот же юзер создает файл .wav, он же успешно создает .ogg.

Но опять же происходит это без учета while fuser "$1"

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
Ну, включите дебаг и добавьте пару проверок, типа "ls -l file" и "lsof | grep file".

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6747
  • Ubuntu 16.04
    • Просмотр профиля
ArcFi,
1. как мне увидеть debug по set -x во время работы астериска?
2. как его выключить потом?
3. я просто добавил запись в файл из скрипта всех действий, получается что при работе от астериска fuser не показывает, что файл занят.

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
#!/bin/bash
set -x
exec &>/tmp/script.log

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6747
  • Ubuntu 16.04
    • Просмотр профиля
ArcFi,
ой, блин, я вообще не туда смотрел... сейчас пробую.

Пользователь решил продолжить мысль 04 Декабрь 2014, 07:50:30:
В общем вызывается скрипт 2 раза, т.к. 2 раза срабатывает отбой, после того как оператор1 положит и после того как положит оператор2. Но это не суть, проблема в том, что fuser вызыванный от asterisk не работает. На сегодня закончу, голова уже болит, попробую завтра.
« Последнее редактирование: 04 Декабрь 2014, 07:50:30 от thunderamur »

Оффлайн Vlad.V

  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Мне кажется проще эту проблему решать из Астериска. А что за другой канал? Можно чуть подробнее про сам dailplan(extensions)? Может идея какая-то в голову придет  :o

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
проблема в том, что fuser вызыванный от asterisk не работает.
Либо кривой PATH, либо не хватает прав доступа.
И то и другое можно починить.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6747
  • Ubuntu 16.04
    • Просмотр профиля
ArcFi,
Я пробовал давать полный путь до бинарей, то же самое. Права доступа должны быть, удаление же происходит из скрипта.

Vlad.V,
вот кусок диалплана

(Нажмите, чтобы показать/скрыть)

Жму, внутри h, потому, что хочу писать в имя файла ${DIALEDPEERNUMBER}, а оно неопределено в момент запуска MixMonitor(). Вообще можно от этого отказаться, так как все равно сейчас записи из веб-интерфейса прослушиваются, мб если указать скрипт здесь, будет норм?

same=>n,MixMonitor(${dfname}.wav,,/admin/ast_dial_rec ${dfname}.wav ${dfname}.ogg)
но почему-то в этом случае он вообще не отрабатывает, остается лежать *.wav.

Пользователь решил продолжить мысль [time]05 Декабрь 2014, 15:13:45[/time]:
Vlad.V,
другой канал это local/sip-number, который используется при переводе звонка. Чтобы запись была одна от ответа оператором1, до разговора с оператором2 включительно я юзаю AUDIOHOOK_INHERIT.

Пользователь решил продолжить мысль 05 Декабрь 2014, 08:15:18:
ArcFi,
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 05 Декабрь 2014, 08:15:18 от thunderamur »

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
Кстати, вот вычитал:
Цитата: man fuser
fuser may only be able to gather partial information unless run with privileges.  As a consequence, files opened by processes belonging  to other users may not be listed and executables may be classified as mapped only.
Т.е., скорее всего, ему где-то не хватает прав доступа.

Имеет смысл проверить UID и GID в скрипте:
id -nu ; id -ng
И нужно убедиться, что fuser работает одинаково и под привилегированным юзером и под ограниченным:
sudo /usr/sbin/fuser file
sudo -iu asterisk /usr/sbin/fuser file

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6747
  • Ubuntu 16.04
    • Просмотр профиля
ArcFi,
так и есть
sudo -iu asterisk /usr/sbin/fuser fileвозвращает 0.

какие права нужно добавить пользователю, чтобы он мог использовать fuser?

Пользователь решил продолжить мысль 05 Декабрь 2014, 09:57:25:
Installing fuser SUID root will avoid problems associated with partial information, but may be undesirable for security and privacy reasons.
Только так видимо? Если не найду как со стороны астериска обойти.
« Последнее редактирование: 05 Декабрь 2014, 09:57:25 от thunderamur »

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
какие права нужно добавить пользователю, чтобы он мог использовать fuser?
Честно говоря, сходу не отвечу.
Надо погуглить, или методом исключения, начиная с максимальных и постепенно понижая.
В крайнем случае, разрешить выполнение скрипта от суперпользователя через sudo без запроса пароля.

Но кому попало разрешать fuser опасно.
Через него можно убивать процессы.

А может как-то извернуться созданием lock-файла?
Либо попробовать lsof, хотя он наверно тоже затребует привилегии.
« Последнее редактирование: 05 Декабрь 2014, 10:35:45 от ArcFi »

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6747
  • Ubuntu 16.04
    • Просмотр профиля
ArcFi,
т.е. добавить asterisk в sudoers и отключить запрос пароля sudo для asterisk?

lsof сразу пробовал, также себя ведет.

Оффлайн ArcFi

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 15194
    • Просмотр профиля
    • aetera.net
т.е. добавить asterisk в sudoers и отключить запрос пароля sudo для asterisk?
Да, как вариант, но разрешить выполнение лишь этого скрипта.

А создать lock-файл в момент начала записи и удалить по окончании не получится?
И ещё можно грепать процессы, там наверняка будет тот, который блокирует файл, возможно даже с аргументом в виде имени этого файла.

 

Страница сгенерирована за 0.06 секунд. Запросов: 24.