Shell Script: Enviando entrada para o processo em segundo plano

0

Estou usando o seguinte script para assistir a uma pasta e, se o tamanho mudar e um arquivo não existir, ele executará um script.

#!/usr/bin/sh
SCRIPT="dim_import/xdir"

while true;
do
    size=$(du -s dim_import | cut -b 1-2)
    if [ $size -gt 32 ]; then
        if [ ! -f files ]; then
          $SCRIPT
        fi
    fi
    sleep 2
done

Eu corro o script assim

>watcher &

O problema é que o script que é executado dentro do programa watcher requer entrada. Ele ecoa o prompt, mas a entrada não é enviada para esse script, mas para o shell atual. Assim, se eu inserir 1234, recebo isto:

sh: 1234:  not found.

Como posso me certificar de enviar a entrada para o local correto?

Eu tentei muitos métodos diferentes e nenhum parece funcionar por causa da maneira única que estou fazendo isso. Eu também estou aberto a melhores métodos / trabalho. O script também tem a capacidade de lidar com a entrada que quero enviar como argumento.

EDIT: Estou tentando enviar um número como 62918

EDIT: Eu também poderia fazer algo assim, mas recebo o mesmo erro:

    SCRIPT="dim_import/xdir"

    while true;
    do
        size=$(du -s dim_import | cut -b 1-2)
        if [ $size -gt 32 ]; then
            if [ ! -f files ]; then
              echo "SR Number: "; read srNum
              $SCRIPT $srNum
            fi
        fi
        sleep 2
    done

Observação: não estou usando o Bash. Eu estou usando o Sh.

    
por James 17.07.2015 / 17:56

2 respostas

0

Através de muita pesquisa, determinei que não é possível com as restrições. Eu encontrei um trabalho menos do que desejável ao redor no entanto.

Basicamente criei um pipe nomeado (chamado ".in") e enviei informações. Eu criei uma função para que tudo que eu tenho que fazer é digitar "i [input]"

SCRIPT=".dim_import/xdir"

while true;
do
    size=$(du -s .dim_import | cut -b 1-2)
    if [ $size -gt 32 ]; then
        if [ ! -f ~/files ]; then
          echo "SR Number (i [number]): "; 
          read srNum < ~/.in
          $SCRIPT $srNum
          sleep 10
          ~/scripts/listSR
        fi
    fi
    if [ ~/ ]
    sleep 5
done

Função de perfil:

function i
{
  set +u
  echo $1 > ~/.in
  set -u
}
    
por 21.07.2015 / 19:03
2

Bem, a verdadeira questão é qual entrada você realmente quer enviar para o seu SCRIPT. Se você quer que ele tenha uma entrada vazia, então execute:

$SCRIPT < /dev/null

Se você quiser dar uma entrada específica, como o conteúdo de $ size, execute:

echo "$size" | $SCRIPT

Se você quiser digitar a entrada, então terá que colocá-la de volta no forground para digitar sua entrada e depois colocá-la novamente em segundo plano. A capacidade de fazer isso depende se o seu shell tem controle de trabalho (a maioria faz, mas o shell Bourne original não). Faça isso:

  • Execute fg %watcher ou fg %1 (usando o número da tarefa que você vê após executar jobs -l ) para colocar o processo em primeiro plano.
  • Digite a entrada desejada e retorne.
  • Digite control-Z para colocá-lo de volta no segundo plano (ou use stty -a e verifique susp para ver qual é o caractere de parada).
  • Após o programa ser interrompido pelo controle-Z, coloque-o de volta no background com bg %1 (ou qualquer que seja o número).

Ainda outra resposta seria ter um pipe nomeado. Aqui está um exemplo (usando tr no lugar do seu script apenas para mostrar):

$ mkfifo my_fifo
$ tr a-z A-Z < my_fifo &
$ exec 6> my_fifo
$ echo here is some input for the fifo >&6
$ HERE IS SOME INPUT FOR THE FIFO

Primeiro, você executa o script, tomando como entrada o fifo (importante para executar o script primeiro). Então exec 6> ... faz o descritor de arquivo 6 do shell gravar no fifo. Então, sempre que você quiser enviar a saída, escreva-a no descritor de arquivo 6 (via >&6 ). Observe o final "aqui está ..." não foi digitado por mim, apenas foi a saída de tr.

    
por 17.07.2015 / 18:06