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

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

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

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

4
задан 4 April 2017 в 11:16

1 ответ

В первую очередь, почему Вы не видите вывода? Как указано Sergiy Kolodyazhnyy в комментариях, сценарии, запущенные udev ", не наследовались весь одинаковый переменные среды, что означает, что у них нет способа знать, где и какую сессию GUI Вы выполняете". В более простых терминах udev не осведомлен когда дело доходит до Вашего настольного GUI.

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

Обзор:

  • я запускаю сценарий помощника, который создает именованный канал и часы что именованный канал для "сообщений", перемещающихся через него.
  • у меня есть udev, настроенный для "отправки, сообщения" (запишите строки) к моему именованному каналу (в моем случае USB sn и информация о разделе).
  • Мой сценарий помощника видит, что каждая строка текста входит, и я использую, уведомляют - отправляют для дампа сообщения на моем экране в форме уведомления.

, Если Вы просто хотите видеть его в окне терминала, Вы могли бы сказать Вашему сценарию помощника просто повторять текст от именованного канала в окне терминала.

<час>

Пример кода:

#!/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
  • Из другого окна терминала/script/udev, для выполнения /tmp/sample_script.sh "message to send" (заметьте, что мы передаем аргумент строки, "обменивайтесь сообщениями для отправки", здесь)
  • Взгляд назад на сервисное окно, и Вы будете видеть, что строка, "сообщение для отправки", появилась в окне.

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

5
ответ дан 1 December 2019 в 09:32

Другие вопросы по тегам:

Похожие вопросы: