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

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

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

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

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

5 ответов

Прежде всего, почему вы не видите результат? Как отметил Сергей Колодяжный в комментариях, сценарии, начатые 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"

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

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

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

5
ответ дан 23 May 2018 в 00:00
  • 1
    Не могли бы вы рассказать о том, как «сообщить вашему вспомогательному скрипту просто эхо-текст из именованного канала в окне терминала»? – kurja 20 April 2017 в 21:56

Прежде всего, почему вы не видите результат? Как отметил Сергей Колодяжный в комментариях, сценарии, начатые 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"

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

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

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

5
ответ дан 18 July 2018 в 15:35

Прежде всего, почему вы не видите результат? Как отметил Сергей Колодяжный в комментариях, сценарии, начатые 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"

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

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

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

5
ответ дан 24 July 2018 в 20:40

Прежде всего, почему вы не видите результат? Как отметил Сергей Колодяжный в комментариях, сценарии, начатые 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"

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

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

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

5
ответ дан 31 July 2018 в 23:41

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

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

Обзор:

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

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


Пример кода:

#!/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" (обратите внимание, что мы передаем строковый аргумент, "message для отправки », здесь)
  • Оглянитесь в окне обслуживания, и вы увидите, что в окне появилась строка« Сообщение для отправки ».

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

5
ответ дан 2 August 2018 в 18:38

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

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