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


Автор Тема: Как в bash выполнить скрипт по событию  (Прочитано 5051 раз)

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

Оффлайн jD

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Как в bash выполнить скрипт по событию, в частности после монтирования съемного носителя?
Предполагается что скрипт будит копировать файлы на смонтированный раздел, а по окончании отправит звуковой сигнал на системный динамик, как это сделать , тоже пока не знаю.))))))


Оффлайн Alsvartr

  • Активист
  • *
  • Сообщений: 779
  • The secret of the secret
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #1 : 22 Декабрь 2008, 00:48:03 »
Как в bash выполнить скрипт по событию, в частности после монтирования съемного носителя?
Смотреть в сторону udev.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #2 : 22 Декабрь 2008, 05:36:34 »
по поводу звука смотри на любой консольный плеер.
aplay
mplayer

Оффлайн barmale-y

  • Любитель
  • *
  • Сообщений: 59
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #3 : 22 Декабрь 2008, 22:53:58 »
Как в bash выполнить скрипт по событию, в частности после монтирования съемного носителя?
Предполагается что скрипт будит копировать файлы на смонтированный раздел, а по окончании отправит звуковой сигнал на системный динамик, как это сделать , тоже пока не знаю.))))))




./my_script.sh &&  mp3blaster final.ogg

mp3blaster - полноэкранный консольный проигрыватель файлов mp3 и Ogg Vorbis

Оффлайн Nebulosa

  • Активист
  • *
  • Сообщений: 397
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #4 : 23 Декабрь 2008, 15:22:46 »
Через wget .. & aplay -q done.wav я узнаю что пора смотреть новое кино!  ;D

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #5 : 24 Декабрь 2008, 06:09:10 »
Если скорость приличная смотреть кино можно прямо во время скачивания :)

Оффлайн vrybas

  • Активист
  • *
  • Сообщений: 505
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #6 : 24 Декабрь 2008, 08:57:25 »
$ (sleep 25200 && mplayer -loop 0 /usr/share/sounds/ekiga/ring.wav) &отличный будильник  :)

--

Можно определять подключено ли USB устройство через вывод lsusb. Я как-то писал скрипт чтобы при подключении/отключении мышки отключался/включался тачпад. Сейчас с консольным отключением тачпада стало сложнее из-за новой политики Xorg. Но можешь мою писанину поправить и заюзать:
(правда он на ruby, а не на bash)

  1 #!/usr/bin/ruby
  2 while true
  3   STDOUT.sync = true
  4     IO.popen(%&lsusb | grep Mouse&) { |f|
  5       until f.eof?
  6         @mouse_plugged_in = f.gets
  7       end
  8     }
  9   @mouse_plugged_in ? system('synclient touchpadoff=1') : system('synclient touchpadoff=0')
 10   @mouse_plugged_in = nil
 11   sleep 1
 12 end

В строке 4 поправь 'Mouse' на то, что ты хочешь проверять.
В строке 9 команда внутри system('_bash_command_here_') после '?' выполняется если grep что-нибудь нашел, а после ':' - если не нашел

Но на самом деле лучше будет делать не lsusb, а ls /dev/disk/by-uuid/, потому что тогда можно будет забить в grep конкретный UUID конкретного раздела, в том числе и на флешке, и уж быть уверенным что скрипт среагирует только на твою. UUID можно узнать через sudo blkid

А еще лучше не фигачить все это в бесконечном цикле  :) , а написать полноценного демона, который может форкаться, спать и просыпаться на сигналы. Но это уже не ко мне.

Оффлайн Alsvartr

  • Активист
  • *
  • Сообщений: 779
  • The secret of the secret
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #7 : 24 Декабрь 2008, 09:58:26 »
А зачем изобретать велосипед? Есть udev, через его правила можно спокойно все это реализовать без лишнего геморроя.

Оффлайн vrybas

  • Активист
  • *
  • Сообщений: 505
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #8 : 24 Декабрь 2008, 17:08:07 »
А зачем изобретать велосипед? Есть udev, через его правила можно спокойно все это реализовать без лишнего геморроя.

и правда. Что-то проскочил твой коммент мимо глаз.
"Usually udev runs as udevd and receives events directly from the kernel if a device is added or removed from the system."

копать в его сторону

Оффлайн jD

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #9 : 24 Декабрь 2008, 18:45:06 »
устройство не монтируется, подскажите где ошибка?

узнал как определилось устройство и его UUID
~$ sudo fdisk -l
Диск /dev/sdb: 521 МБ, 521011200 байт
64 heads, 32 sectors/track, 496 cylinders
Units = цилиндры of 2048 * 512 = 1048576 bytes
Disk identifier: 0x8f800000

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sdb1   *           1         496      507888    b  W95 FAT32

~$ sudo /lib/udev/vol_id /dev/sdb1
ID_FS_USAGE=filesystem
ID_FS_TYPE=vfat
ID_FS_VERSION=FAT32
ID_FS_UUID=8049-FBF1
ID_FS_UUID_ENC=8049-FBF1
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=

создал правило для udev
/etc/udev/rules.d/au_reg.rules
ACTION=="add", KERNEL=="sdb1", PROGRAM=="/lib/udev/vol_id -uuid %N", RESULT=="8049-FBF1", RUN+="/bin/mount -t vfat /dev/sdb1 /mnt/au_reg"
ACTION=="add", KERNEL=="sdb1", PROGRAM=="/lib/udev/vol_id -uuid %N", RESULT=="8049-FBF1", RUN+="/bin/sh /home/jd/au_reg_cp.sh && play /home/jd/au_reg/end.wav"
play end.wav - при условии что установлен SoX
создал скрипт
/home/jd/au_reg_cp.sh

 #!/bin/bash
DATE=`date '+%F'`
#Создадим папку + Дата.
mkdir /mnt/au_reg/by_$DATE
#Укажем куда копировать.
CR=/mnt/au_reg/by_$DATE
#копируем
cp -f /home/jd/test.wav $CR

использовал пример
#http://lug-mgn.ru/articles/bekap-na-fleshku-ispolzuem-udev
« Последнее редактирование: 26 Декабрь 2008, 14:48:52 от jD »

Оффлайн jD

  • Автор темы
  • Новичок
  • *
  • Сообщений: 17
    • Просмотр профиля
Re: Как в bash выполнить скрипт по событию
« Ответ #10 : 26 Декабрь 2008, 14:40:25 »
смонтировал таким образом
создал правило для udev
/etc/udev/rules.d/10-udev-my.rules
# First rule
BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", NAME="%k", GROUP="disk", RUN+="/etc/udev/scripts/udev-flash-mount add %k"
#Second rule
BUS=="usb", SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="remove", RUN+="/etc/udev/scripts/udev-flash-mount remove %k"
скрипт
/etc/udev/scripts/udev-flash-mount
#!/bin/bash

LOG="/var/log/udev"

sleep 3

DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`
if [ "$1" = "add" ]; then
  if [ "$DEV" != "" ]; then
    echo "--- `date` ---" >> $LOG
    echo "Mounting /dev/$DEV" >> $LOG
    chmod a+rwx /mnt/au_reg >> $LOG 2>&1
    mount /dev/$DEV /mnt/au_reg -o sync,umask=0000,iocharset=cp1251 >> $LOG 2>&1

  fi
elif [ "$1" = "remove" ]; then
  if [ "$DEV" != "" ]; then
    echo "--- `date` ---" >> $LOG
    echo "Unmounting /dev/$DEV" >> $LOG
    umount /dev/$DEV >> $LOG 2>&1
  fi
fi
#http://ru.gentoo-wiki.com/wiki/HOWTO_Udev_%D0%B8_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%BE%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BD%D0%BE%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%B9
когда сделал в точности по статье, после отключения флэшки папка куда она монтировалась не удалялась, а при повторном подключении создавалась новая, sdb1, sdc1, ...
« Последнее редактирование: 26 Декабрь 2008, 14:48:17 от jD »

 

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