Не работает правило udev c espeak и aplay [Решено]
lexx4000 14 сентября, 2012 - 10:06
Дорого времени суток. Суть проблемы следующая:
При добавлении в скрипт вызываемый udev строку "espeak --stdout "some text" | aplay" правило игнорируется. Причем после удаления этой строки из скрипта правило не работает, переименование файла скрипта не помогло. Помогло только переименование правила.
alessandro@localhost ~ $ cat /etc/udev/rules.d/66-auto-mount-flash.rules SUBSYSTEM=="block",KERNEL=="sd[d-z][1-9]",ACTION=="add",ATTRS{removable}=="1",RUN+="/etc/udev/scripts/udev-flash-mount.bash %k %E{ID_FS_TYPE} %E{ID_FS_LABEL}" SUBSYSTEM=="block",KERNEL=="sd[d-z][1-9]",ACTION=="remove",RUN+="/etc/udev/scripts/udev-flash-umount.bash %k %E{ID_FS_LABEL}" #это правило игнорилось
alessandro@localhost ~ $ cat /etc/udev/scripts/udev-flash-mount.bash #!/bin/bash LOG="/var/log/udev" DEV=$1 FS_LABEL=$3 FS_TYPE=$2 R_DEV=`echo "$DEV" | sed 's/[1-9]//g'` echo "$1 $2 $3" >> $LOG if [ -z "$FS_LABEL" ]; then FS_LABEL=$DEV fi if [ $FS_TYPE = "vfat" ]; then opt="dirsync,flush,rw,nodiratime,iocharset=utf8,codepage=866,gid=100,umask=0000" elif [ $FS_TYPE = "ntfs" ]; then opt="dirsync, flush, rw,nodiratime,nls=utf8,gid=100,umask=0000,posix=1" elif [ $FS_TYPE = "udf" ]; then opt="unhide,iocharset=utf8,dirsync,sync,gid=100,umask=0000" else opt="dirsync,sync,gid=100,umask=0000" FS_TYPE="auto" fi echo "-----------`date`-----------" >> $LOG echo "mounting a /dev/$DEV" >> $LOG mkdir /mnt/$DEV >> $LOG 2>&1 echo "$FS_TYPE $opt" >> $LOG mount -t $FS_TYPE -o "$opt" /dev/$DEV /mnt/$DEV >> $LOG 2>&1 echo "creating symlink" >> $LOG ln -s /mnt/$DEV /media/"$FS_LABEL" >> $LOG 2>&1 echo "selecting a noop sheduler" >> $LOG echo "noop" > /sys/block/$R_DEV/queue/scheduler
alessandro@localhost ~ $ cat /etc/udev/scripts/udev-flash-umount.bash #!/bin/bash LOG="/var/log/udev" DEV=$1 FS_LABEL=$2 echo "sss" >> /var/log/udev if [ -z "$FS_LABEL" ]; then FS_LABEL=$DEV echo "-------------`date`------------" >> $LOG echo "umounting /dev/$DEV" >> $LOG umount /mnt/$DEV >> $LOG 2>&1 echo "removing mount dir and symlink" >> $LOG rm -r /mnt/$DEV rm /media/"$FS_LABEL" echo "$1 $2" >> $LOG # здесь была строка espeak --stdout "device removed" | aplay
Версия udev-171-r6. В /var/log ничего подозрительного нету.
Помогите определить в чем загвоздка.
UPD
udev работает в безтерминальной среде потому применение пайпа вызывает странности.
»
- Для комментирования войдите или зарегистрируйтесь
espeak собран без поддержки
espeak собран без поддержки portaudio и pulseaudio
Ubuntu это отличный livecd для установки gentoo
а если выхлоп потока stderr у
а если выхлоп потока stderr у espeak/aplay писать в файл, что там?
Нейтральность - высшее достижение сознания!
Выхлоп
Обычный пользователь:
alessandro@localhost ~ $ espeak --stdout "hale master" 2>&1 | aplay 2>&1
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
под рута:
localhost alessandro # espeak --stdout "hale master" 2>&1 | aplay 2>&1
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
Из udev получить не удалось, скрипт на удаление флешки не отрабатывает. Строки вида "speak --stdout "hale master" | aplay" в скрипте нету
Ubuntu это отличный livecd для установки gentoo
Из экспериментов
Из прочитанного в гугле уяснил что "udev не запускает такие программы на любом активном терминале, и не запускает их в контексте оболочки (shell). Убедитесь, что ваша программа является выполняемой (executable); если это скрипт шелла, убедитесь, что он стартует с соответствующим shebang http://en.wikipedia.org/wiki/Shebang_(Unix) (например, #!/bin/sh), и не ожидайте появления на вашем терминале стандартного вывода."
Добавление строк типа
espeak --stdout "bla" > /tmp/110
aplay /tmp/110
к ошибке не приводит. Значит дело в пайпе.
И кстати переименование правила не помогает, помогает изменение самого скрипта.
Ubuntu это отличный livecd для установки gentoo
чудеса
как это ни странно но строку с говорилкой добавил и скрипт работает и говорит...
Ubuntu это отличный livecd для установки gentoo