script iniciado a partir da regra do udev não exibido no terminal?

4

Eu fiz um script para executar o rsync e adicionei read line no final para manter a saída visível depois de ter sido executada; isso funciona como planejado quando eu executo o script manualmente.

Eu fiz uma regra do udev RUN+="/home/user/bin/scriptfile" para executar meu script acima e o script é executado como pretendido, mas a saída não é exibida em uma janela de terminal. Por que não, e como posso fazer isso?

edit - para esclarecer: tentei iniciar vários scripts diferentes a partir das regras do udev, e ele funciona bem, os scripts são executados e fazem o que eu esperava. A questão é, posso ter a saída impressa na minha tela quando um script é executado. Eu posso direcionar a saída para um arquivo de log, que funciona também, mas eu gostaria de vê-lo visível na tela quando o script estiver sendo executado.

    
por kurja 03.04.2017 / 21:38

1 resposta

5

Primeiro, por que você não vê a saída? Como apontado por Sergiy Kolodyazhnyy nos comentários, os scripts iniciados pelo udev "não herdam as mesmas variáveis de ambiente, o que significa que eles não têm como saber onde e qual sessão da GUI você está executando." Em termos mais simples, o udev é ignorante quando se trata da GUI da área de trabalho.

Atualmente, faço algo semelhante ao que você pediu para dispositivos USB conectados ao meu sistema. Para um aplicativo que estou executando, preciso saber se o USB tem um número de série válido. De qualquer forma, aqui está como eu fiz isso acontecer.

Visão geral:

  • Eu inicio um script auxiliar que cria um pipe nomeado e observa esse pipe nomeado para "mensagens" que trafegam nele.
  • Eu configurei o udev para "enviar mensagens" (linhas de gravação) para o meu pipe nomeado (no meu caso, informações de sn do USB e de partição).
  • Meu script auxiliar vê cada linha de texto entrar e eu uso o comando notify-send para despejar a mensagem na minha tela na forma de uma notificação.

Se você quiser vê-lo apenas em uma janela de terminal, poderá informar ao seu script de ajuda para simplesmente fazer eco do texto do canal nomeado na janela do terminal.

Código de amostra:

#!/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 [ "" == "" ]; 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 "" >> "$pipe"

Executando este script:

  • Salve as opções acima em um arquivo /tmp/sample_script.sh (será excluído na reinicialização)
  • Torne o script executável chmod +x /tmp/sample_script.sh
  • Chame o script para executá-lo no modo de serviço (ou seja, sem nenhum argumento) /tmp/sample_script.sh
  • Em outra janela de terminal / script / udev, execute /tmp/sample_script.sh "message to send" (observe que estamos passando o argumento string, "message to send", here)
  • Volte para a janela de serviço e você verá que a string "message to send" apareceu na janela.

Ao executar o script do udev, você não poderá fazer com que a segunda instância exiba qualquer coisa na tela diretamente, sem redirecioná-la pelo canal nomeado, porque o script do udev é chamado a partir de um ambiente completamente separado do O pipe nomeado criado no script e utilizado em ambos os ambientes atua como uma ponte entre os dois, permitindo que você transmita informações do ambiente do udev para o ambiente da GUI que está visualizando.

    
por b_laoshi 20.04.2017 / 09:01

Tags