Я создал скрипт для запуска 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"
Запуск этого скрипта:
Я запускаю вспомогательный скрипт, который создает именованный канал и наблюдает за этим именованным каналом для «сообщений», перемещающихся через него. Сделать исполняемый файл сценария chmod +x /tmp/sample_script.sh У меня udev настроен на «отправку сообщений» (запись строк) на мой именованный канал (в моем случае USB sn и информация раздела). Из другого терминального окна / script / udev, запустите /tmp/sample_script.sh "message to send" (обратите внимание, что мы передаем строковый аргумент, «сообщение для отправки» здесь) В моем вспомогательном скрипте появляется каждая строка текста, и я используйте notify-send, чтобы отправить сообщение на моем экране в виде уведомления.При запуске скрипта из udev вы не сможете получить второй экземпляр для вывода чего-либо на экране напрямую, не перенаправляя его по именованному каналу, потому что ваш скрипт udev называется f полностью изолированную от среды, в которой работает ваш графический интерфейс. Именованный канал, созданный в сценарии и используемый в обеих средах, действует как мост между ними, позволяя вам передавать информацию из среды 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"
Запуск этого скрипта:
Я запускаю вспомогательный скрипт, который создает именованный канал и наблюдает за этим именованным каналом для «сообщений», перемещающихся через него. Сделать исполняемый файл сценария chmod +x /tmp/sample_script.sh У меня udev настроен на «отправку сообщений» (запись строк) на мой именованный канал (в моем случае USB sn и информация раздела). Из другого терминального окна / script / udev, запустите /tmp/sample_script.sh "message to send" (обратите внимание, что мы передаем строковый аргумент, «сообщение для отправки» здесь) В моем вспомогательном скрипте появляется каждая строка текста, и я используйте notify-send, чтобы отправить сообщение на моем экране в виде уведомления.При запуске скрипта из udev вы не сможете получить второй экземпляр для вывода чего-либо на экране напрямую, не перенаправляя его по именованному каналу, потому что ваш скрипт udev называется f полностью изолированную от среды, в которой работает ваш графический интерфейс. Именованный канал, созданный в сценарии и используемый в обеих средах, действует как мост между ними, позволяя вам передавать информацию из среды 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"
Запуск этого скрипта:
Я запускаю вспомогательный скрипт, который создает именованный канал и наблюдает за этим именованным каналом для «сообщений», перемещающихся через него. Сделать исполняемый файл сценария chmod +x /tmp/sample_script.sh У меня udev настроен на «отправку сообщений» (запись строк) на мой именованный канал (в моем случае USB sn и информация раздела). Из другого терминального окна / script / udev, запустите /tmp/sample_script.sh "message to send" (обратите внимание, что мы передаем строковый аргумент, «сообщение для отправки» здесь) В моем вспомогательном скрипте появляется каждая строка текста, и я используйте notify-send, чтобы отправить сообщение на моем экране в виде уведомления.При запуске скрипта из udev вы не сможете получить второй экземпляр для вывода чего-либо на экране напрямую, не перенаправляя его по именованному каналу, потому что ваш скрипт udev называется f полностью изолированную от среды, в которой работает ваш графический интерфейс. Именованный канал, созданный в сценарии и используемый в обеих средах, действует как мост между ними, позволяя вам передавать информацию из среды 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"
Запуск этого скрипта:
Я запускаю вспомогательный скрипт, который создает именованный канал и наблюдает за этим именованным каналом для «сообщений», перемещающихся через него. Сделать исполняемый файл сценария chmod +x /tmp/sample_script.sh У меня udev настроен на «отправку сообщений» (запись строк) на мой именованный канал (в моем случае USB sn и информация раздела). Из другого терминального окна / script / udev, запустите /tmp/sample_script.sh "message to send" (обратите внимание, что мы передаем строковый аргумент, «сообщение для отправки» здесь) В моем вспомогательном скрипте появляется каждая строка текста, и я используйте notify-send, чтобы отправить сообщение на моем экране в виде уведомления.При запуске скрипта из udev вы не сможете получить второй экземпляр для вывода чего-либо на экране напрямую, не перенаправляя его по именованному каналу, потому что ваш скрипт udev называется f полностью изолированную от среды, в которой работает ваш графический интерфейс. Именованный канал, созданный в сценарии и используемый в обеих средах, действует как мост между ними, позволяя вам передавать информацию из среды udev в среду графического интерфейса, которую вы 'смотрим на.
Прежде всего, почему вы не видите выход? Как отметил Сергей Колодяжный в комментариях, сценарии, начатые udev, «не наследуют все те же переменные среды, а это значит, что у них нет способа узнать, где и какой сеанс GUI вы используете». Проще говоря, udev не знает, когда дело доходит до графического интерфейса вашего рабочего стола.
В настоящее время я делаю что-то похожее на то, что вы просили USB-устройства, подключенные к моей системе. Для приложения, которое я запускаю, мне нужно знать, имеет ли USB действительный серийный номер. Во всяком случае, вот как я это сделал.
Обзор:
Если вы просто хотите увидеть его в окне терминала, вы можете сообщить 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
/tmp/sample_script.sh "message to send"
(обратите внимание, что мы передаем строковый аргумент, "message для отправки », здесь) При запуске скрипта из udev вы не сможете получить второй экземпляр для вывода чего-либо на экране напрямую, не перенаправляя его через именованный канал, потому что ваш скрипт udev вызывается из среды, полностью отделенной от среды ваш графический интерфейс работает. Именованный канал, созданный в скрипте и используемый в обеих средах, действует как мост между ними, что позволяет передавать информацию из среды udev в среду GUI, на которую вы смотрите.