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


Автор Тема: Завершение работы скрипта  (Прочитано 697 раз)

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

Оффлайн pspvideo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Завершение работы скрипта
« : 07 Июнь 2014, 09:35:30 »
Привет сообщество!
Есть скрипт script.sh, начинает он работать при нажатии на одну из клавиш (реализовано через xbindkeys) Имею два вопроса:
1-как избежать повторного выполнения скрипта при, например, длительном нажатии на кнопочку или при неосторожном повторном нажатии (в идеале запретить повторное выполнение скрипта, ну скажем, в течении 5 секунд)
2-как другим скриптом убить процесс выполнения script.sh?

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 1785
    • Просмотр профиля
Re: Завершение работы скрипта
« Ответ #1 : 07 Июнь 2014, 10:38:47 »
1. Создавать при запуске скрипта какой-нибудь lock-филе командой touch
   а перед этим проверять его наличие и, если он есть, заканчиваться.
   Перед выходом удалять его.
2. Убить процесс можно командой
kill `pidof имя_процесса` 
Пётр.

Оффлайн pspvideo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Завершение работы скрипта
« Ответ #2 : 07 Июнь 2014, 10:52:38 »
с блокировкой клавы пробовал так:
$ xinput --list | grep AT
↳ AT Translated Set 2 keyboard    id=12   [slave keyboard (3)]
$ xinput --list-props 12
Device 'AT Translated Set 2 keyboard':
    Device Enabled (139):   1
    Evdev Reopen Attempts (300):   10
Создал 2 ярлыка:
unlock:
/usr/bin/xinput --set-prop 12 139 1
lock:
/usr/bin/xinput --set-prop 12 139 0

Создаю скрипт:

/usr/bin/xinput --set-prop 12 139 0
echo "Здравствуй! Пойдем выпьем пива!" | RHVoice | aplay
/usr/bin/xinput --set-prop 12 139 1

казалось бы - всё логично, первая строчка после нажатия на кнопку
отрубает клавиатуру, потом выполняется вторая сторока и через
колонки слышим голос, затем третья строка разблокирует клаву. YES! вот
оно счастье.
Делаю скрипт запускаемым. Запускаю двойным тыком по крысе - работает! Главное если попытаться нажать какую либо
клавишу, пока отрабатывае скрипт, фиг!
прикрутил скрипт к клавише. Тыркаю на неё, а в ответ многократное заикание, скрипт отработал бесчисленное кол-во раз. Пичалька :(
В чем дело?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: Завершение работы скрипта
« Ответ #3 : 07 Июнь 2014, 13:29:59 »
Если xbindkeys настроить не нажатие, а на отпускание клавиши?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн pspvideo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Завершение работы скрипта
« Ответ #4 : 07 Июнь 2014, 13:51:39 »
Если xbindkeys настроить не нажатие, а на отпускание клавиши?

А как? Я не гуру, пока не гуру.

Оффлайн pspvideo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 11
    • Просмотр профиля
Re: Завершение работы скрипта
« Ответ #5 : 08 Июнь 2014, 14:31:55 »
Решение:
#!/usr/bin/env bash
LOCK_FILE="/tmp/script.lock";
PID=$(pgrep -F $LOCK_FILE 2> /dev/null);
test -z $PID && {
    cat txt.txt | RHVoice | aplay & PID=$!;
    echo $PID > $LOCK_FILE;
    wait || exit 1;
    echo "Привет Мир" | RHVoice | aplay & PID=$!;
    echo $PID > $LOCK_FILE;
    wait || exit 2;
}
exit 0;

И второй скрипт прибивает aplay

#!/usr/bin/env bash
LOCK_FILE="/tmp/script.lock";
PID=$(pgrep -F $LOCK_FILE 2> /dev/null);
test -z $PID || kill -9 "$PID" 2>/dev/null;
exit 0;

За решение вопроса спасибо ZEN - форум http://debianforum.ru

Пользователь решил продолжить мысль 09 Июнь 2014, 07:08:42:

Имея задачу, весьма приближенно она выглядит так:]
#!/usr/bin/bash
LOCK_FILE="/tmp/script.lock";
PID=$(pgrep -F $LOCK_FILE 2> /dev/null);
test -z $PID && {

# (Блок-1) Вступление
echo "Здравствуйте бла-бла-бла" | RHVoice | aplay & PID=$!;
echo $PID > $LOCK_FILE;
wait || exit 1;

# (Блок-2) Чтение полученного из внешнего источника текста
cat txt.txt | RHVoice | aplay & PID=$!;
echo $PID > $LOCK_FILE;
wait || exit 2;

# (Блок-3) Сообщение окончании информации и приглашение к дальнейшим действиям
echo "Конец текста, желаете получить новую информацию?" | RHVoice | aplay & PID=$!;
echo $PID > $LOCK_FILE;
wait || exit 3;
}
exit 0;

Результаты тестирования.
Скрипт для завершения работы aplay отрабатывает следующим образом:
1. Если чтение проходит в первом блоке и мы нажимаем клавишу вызова скрипта блокировки aplay - чтение прерывается и сразу начинается чтение Блока 2
2. Блок 2 имеет довольно большой обьём текста, и если пользователь понял, по началу текста, что ему данная информация не интересна, он вызывает скрипт-гаситель aplay
3. А теперь о плюшках, юзверь слыша зловещую тишину, решает получить новую инфу и тыркает на кнопку - процесс пошел! Но! примерно через 1-2 минуты в процессе получения важнейшей  :) для него инфы, параллельно, он слышит Блок-3 - Конец текста, желаете получить новую информацию?

Т.е. задержка (величина зависит от размеров текстовой инфы во 2-Блоке) может достигать до 3-х минут, что не есть хорошо.
Кто поделится инфой о причинах, а может и о путях устранения задержки. Сразу говорю, величина задержки составляет примерно 40% от времени прочтения голосом Блока-2
Увеличить мощность ЭВМ - не предлагать.
« Последнее редактирование: 09 Июнь 2014, 07:08:42 от pspvideo »

 

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