Все равно не работает. Привел скрипт к такому виду:
#!/bin/bash
set -x
exec &>>/tmp/script.log
/bin/sleep 5
if /bin/ls "$1"
then
if /bin/fuser "$1"
then
exit 0
else
echo "convert"
#/usr/bin/oggenc "$1" -Q -q 0 -o "$2"
#/bin/rm "$1"
fi
fi
exit 0
но в логе вижу следующее:
+ /bin/sleep 5
+ /bin/ls /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ /bin/fuser /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ echo convert
convert
+ exit 0
+ /bin/sleep 5
+ /bin/ls /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ /bin/fuser /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ echo convert
convert
+ exit 0
thunderamur (
2014-12-04 13:23:23 +0400
)редактироватьт.е. сжатие запускается даже когда файл занят, для проверки запускаю из консоли и занимаю файл плеером.
+ /bin/sleep 5
+ /bin/ls /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
+ /bin/fuser /var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav
/var/spool/asterisk/monitor/2014-12-04__18-16-16__4957776675-990114.wav: 15654
+ exit 0
Видно, что тут норм.
thunderamur ( 2014-12-04 13:24:35 +0400 )редактироватьman fuser:
EXIT STATUS The fuser utility returns 0 on successful completion and >0 otherwise.
Файл не занят:
# fuser dump_1417759166.pcap
dump_1417759166.pcap:
А вот файл занят, тогда помимо имени файла возвращается PID
# fuser dump_1417759227.pcap
dump_1417759227.pcap: 10063w 4182w
Вы анализируете EXIT status, а не возвращенные данные, потому и попадаете все время в convert, т.к. fuser завершается с кодом 0.
virus_net ( 2014-12-05 10:10:25 +0400 )редактировать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.
Installing fuser SUID root will avoid problems associated with partial information, but may be undesirable for security and privacy reasons.
Не хватает прав под asterisk. Либо давать права asterisk, либо ставить SUID на fuser. А мб можно как-то иначе в dialplan сделать?
thunderamur ( 2014-12-05 10:59:09 +0400 )редактироватьПоследний пост, ты не прав. 0 возвращается только когда ни кем не занят файл. У меня в системе так. Кроме того, я показываю проверку запуска скрипта от рута, когда он работает нормально.
thunderamur ( 2014-12-05 11:01:04 +0400 )редактироватьУ меня FreeBSD, в моем мане и по факту fuser работает так. Обычно все в UNIX похожи.
А кстати почему бы не пользовать exten => h,1,...
и вызызвать ваше сжатие там
virus_net ( 2014-12-05 21:01:03 +0400 )редактироватьИзначально так и сделано. При переводе звонка получаем вызов сжатия файла и удаление файла, который ещё пишется для записи разговора с оператором 2. После завершения разговора с оператором 2 вызывается ещё раз, но отрабатывает с ошибкой, т.к. .wav уже нет. На выходе имеем 2 записи в CDR, ссылающиеся на одну неполную запись, содержащую только разговор с оператором1.
thunderamur ( 2014-12-06 08:35:42 +0400 )редактироватьПрошу прощения, что тут сказать, слЯпой я... :) разглядел exten => h....
Ктстати вот ещё одно замечание. Читаем http://www.voip-info.org/wiki/view/Asterisk+func+AUDIOHOOK_INHERIT и смотрим пример.
В нем отчетливо видно, что сначала запускается MixMonitor, а затем устанавливается AUDIOHOOKINHERIT. А теперь смотрим в ваш диалплан, а там с тоностью до наоборот. Сначала у вас устанавливается AUDIOHOOKINHERIT, а потом запускается MixMonitor.
Перестановку местами не тестил, м.б. работает и так и так, но думаю что все же стоит сделать согласно мануалу.
Можете дополнить ваш первый пост и добавить в него текущий контекст как он сейчас есть ?
На тему fuser. Судя по гуглению у вас убунту и маны отличаются. http://manpages.ubuntu.com/manpages/hardy/man1/fuser.1.html
https://www.freebsd.org/cgi/man.cgi?query=fuser
P.S. Если так "лыжи не едут", то почему бы сжатие файлов не вынести в крон ?
virus_net ( 2014-12-06 11:22:40 +0400 )редактироватьПотести в bash if вместе с fuser.
Место установки переменной в данном случае не влияет.
Крон не походит, т.к. запись хотелось бы слушать сразу, а не потом. Слушать .wav не круто, т.к. нужно веб-интерфейс править - лениво.
В общем утром пришла в голову идея... Сделал так
thunderamur ( 2014-12-09 04:56:14 +0400 )редактировать#!/bin/bash
FIRST_SIZE=`ls -l "$1" | awk -F " " '{ print $5 }'`
sleep 5
LAST_SIZE=`ls -l "$1" | awk -F " " '{ print $5 }'`
if [ "$FIRST_SIZE" == "$LAST_SIZE" ]
then
/usr/bin/oggenc "$1" -Q -q 0 -o "$2"
rm "$1"
fi
exit 0
thunderamur (
2014-12-09 04:56:55 +0400
)редактироватьfuser недоступен под asterisk, в то время как с ls проблем нет.
thunderamur ( 2014-12-09 04:57:29 +0400 )редактировать