Intereting Posts
Как я могу конвертировать медиатеку iTunes WAV в FLAC из командной строки? Обновление с 12.04 по 12.10 без потери файлов? Какая точка привязки к тире? Как установить Windows 7 вместе с уже существующей установкой Ubuntu? Ярлык клавиатуры для языка ввода не работает в оболочке Gnome HP LaserJet 1020 плюс принтер, не работающий в Ubuntu 14.04 Ubuntu 15.10 застревает во время установки (черный экран и 6700HQ ошибка soft lockup cpu # 4 застряла на 22 секунды) Скрипт для сортировки содержимого нескольких файлов в каталоге Могу ли я запустить две виртуальные машины с одного USB? Как включить ALT Gr ключ как ALT R для Emacs на Ubuntu 16.04? Невозможно установить Sublime Text в качестве приложения по умолчанию. Замените CentOS на Ubuntu, сохраняя Windows 10 «Невозможно установить местоположение. Ошибка при попытке подключения общих папок Windows " Как настроить облачный образ в VirtualBox? bash: заполнение массива элементами, содержащими пробелы и специальные символы

скрипт, запущенный из правила udev, не отображается в терминале?

Я создал скрипт для запуска rsync и добавил read line в конце, чтобы сохранить вывод видимым после его запуска; это работает по назначению, когда я запускаю скрипт вручную.

Я выполнил правило udev RUN+="/home/user/bin/scriptfile" чтобы запустить мой вышеприведенный скрипт, и сценарий запускается по назначению, но вывод не отображается в окне терминала. Почему бы и нет, и как я могу это сделать?

edit – уточнить: я попытался инициировать различные скрипты из правил udev, и он отлично работает, запускает скрипты и делает то, что я ожидаю от них. Вопрос в том, могу ли я напечатать вывод на моем экране при запуске скрипта. Я могу направить вывод в файл журнала, который тоже работает, но я хочу, чтобы он отображался на экране при запуске скрипта.

Прежде всего, почему вы не видите выход? Как отметил Сергей Колодяжный в комментариях, сценарии, начатые udev, «не наследуют все те же переменные среды, а это значит, что у них нет способа узнать, где и какой сеанс GUI вы используете». Говоря проще, udev не знает, когда дело доходит до графического интерфейса вашего рабочего стола.

В настоящее время я делаю что-то похожее на то, что вы просили USB-устройства, подключенные к моей системе. Для приложения, которое я запускаю, мне нужно знать, имеет ли USB действительный серийный номер. Во всяком случае, вот как я это сделал.

Обзор:

  • Я запускаю вспомогательный скрипт, который создает именованный канал и наблюдает за этим именованным каналом для «сообщений», перемещающихся по нему.
  • У меня udev настроен на «отправку сообщений» (запись строк) на мой именованный канал (в моем случае информация USB sn и раздел).
  • В моем вспомогательном скрипте появляется каждая строка текста, и я использую notify-send для вывода сообщения на моем экране в виде уведомления.

Если вы просто хотите увидеть его в окне терминала, вы можете сказать, что ваш хелпер-скрипт просто эхо-текст из именованного канала в окне терминала.


Образец кода:

 #!/bin/bash #This script should be called once without an argument to get it running in a "service" mode #Successive calls to this script by UDEV sould pass a string as the first argument. # These strings will then be displayed in the window running in service mode. pipe=/tmp/messages if [ "$1" == "" ]; then [ ! -e "$pipe" ] && mkfifo "$pipe" while true # this loop continuously reads new lines and echos them do line=$(cat "$pipe") echo "$line" done fi # you won't reach this line unless you call this script with one argument echo "$1" >> "$pipe" 

Запуск этого скрипта:

  • Сохраните это в файле /tmp/sample_script.sh (при перезагрузке будет удален)
  • Сделать исполняемый файл скриптом chmod +x /tmp/sample_script.sh
  • Вызовите скрипт, чтобы он работал в сервисном режиме (т. /tmp/sample_script.sh Без каких-либо аргументов) /tmp/sample_script.sh
  • Из другого окна терминала / script / udev запустите /tmp/sample_script.sh "message to send" (обратите внимание, что мы передаем строковый аргумент, «сообщение для отправки», здесь)
  • Посмотрите на служебное окно, и вы увидите, что строка, «сообщение для отправки», появилась в окне.

При запуске скрипта из udev вы не сможете получить второй экземпляр для вывода чего-либо на экране напрямую, не перенаправляя его по именованному каналу, потому что ваш скрипт udev вызывается из среды, которая полностью отделена от среды вашего графического интерфейса . Именованный канал, созданный в скрипте и используемый в обеих средах, действует как мост между ними, что позволяет передавать информацию из среды udev в среду GUI, на которую вы смотрите.