Como executar o nohup em um documento?

1

Eu tenho esse bloco de código de tempo limite:

#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB

Para executar o script com nohup e no plano de fundo , posso colá-lo em um arquivo e executar:

nohup /opt/myscript.sh $$ &

O que eu pretendo alcançar:

Em vez de colá-lo em um arquivo e executar, eu gostaria de executá-lo diretamente de um heredoc:

/dev/fd/10 10<< 'EOF0'
#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB
EOF0

Eu uso um heredoc porque heredocs são a única maneira de colar blocos de código inteiros diretamente no Bash, e então executar - Muito eficiente no meu caso.

Minha pergunta:

Como eu poderia usar corretamente nohup e & com o acima descrito?

Note que o heredoc acima é especial, é um heredoc externo (EOF0), permitindo 1 ou mais heredocs dentro dele (EOF1, EOF2 ...).

    
por JohnDoea 30.12.2016 / 02:02

2 respostas

2

Pelo que entendi, você quer copiar todo o conteúdo do seu script e colá-lo como um heredoc para executá-lo. Você pode fazer isso, mas há um problema: como você atribui um valor ao parâmetro posicional $ 1 que aparecerá no heredoc? O truque aqui é passar esse argumento para bash, colocando-o após um sinal -- (que separa os argumentos que você passa para se basear nos argumentos que você passa para o script). Bash deve, é claro, ler os comandos do stdin, então o -s deve ser especificado.

Para ver isso no trabalho com o código do seu exemplo, abra um novo pseudoterminal e digite isto (cuidado: os sinais de aspas perto do primeiro EOF0 são obrigatórios, eles impedem a expansão de $1 dentro do próprio heredoc) :

nohup bash -s -- $$ <<'EOF0' &
#!/bin/bash

WB=$1
sleep 2h;
commands...
kill $WB
EOF0

No entanto, devo dizer que o EOF0 por si só não tem nenhum significado especial. Você pode usar qualquer cadeia que desejar para um delimitador heredoc (por exemplo, poderia ter sido 'EOF' ou 'HEREDOC_DELIMITER' ): o que importa é que há aspas simples em torno dele, perto do sinal << ; isso impede qualquer expansão dentro do heredoc, o que permite que você use argumentos de script (assim como você pode usar $1 no código que você postou) e aninhar outros heredocs.

    
por 30.12.2016 / 10:56
1

Usando seu código:

nohup bash <<EOF &
WB=$1
sleep 2h;
commands...
kill \$WB
EOF

Observe que $1 será expandido quando o código for lido; para tornar $WB expandir quando o código for executado, o $ precisa ser citado.

    
por 30.12.2016 / 02:29