Como processar 'exec' com env personalizado?

2

Eu sou processo de geração de processos no bash . Eu preciso ser capaz de passar em variáveis de ambiente e comandos arbitrários. Para conseguir isso, estou executando /usr/bin/env e, em seguida, chamando bash -c . Às vezes, o processo que iniciei não para e eu quero matá-lo, mas quando mato o PID que volta do meu comando, ele apenas mata o comando bash e não o processo filho que o bash executou.

Eu vi Encaminhar SIGTERM para o filho no Bash Acho que o problema pode ser corrigido com o bash exec , mas não consigo invocar o comando correto.

Por exemplo, aqui está um script ruby que nunca sai:

STDOUT.sync = true

puts "booted"

while true
  puts "running"
  sleep 1
end

Quando eu executo via $ exec ruby spec/fixtures/never_exits.rb , o programa se comporta como eu quero. Quando eu mato minha sessão bash, o programa é encerrado.

No entanto, quando tento executar isso com env como $ /usr/bin/env bash -c exec ruby spec/fixtures/never_exits.rb , o comando sai imediatamente e não há saída. Não parece que o script está sendo invocado.

É possível usar exec em combinação com a especificação de variáveis de ambiente?

Existe outra maneira de propagar o TERM para um processo filho que pode ser invocado em uma linha?

    
por Schneems 13.06.2016 / 19:40

1 resposta

2

Ao usar as estruturas bash -c type, você precisa colocar o comando inteiro dentro dos caracteres " . por exemplo

$ bash -c echo hello

$ bash -c "echo hello"
hello

Então, no seu caso

env bash -c "exec ruby script.rb"

No entanto, o env neste exemplo realmente não faz muito; você quis dizer env -i para criar um ambiente inicial? Além disso, a menos que haja alguma mágica acontecendo dentro dos scripts de inicialização do bash, você pode não precisar de bash.

 env -i RUBYPATH=/some/dir RUBYLIB=/other/dir /path/to/ruby script.rb
    
por 13.06.2016 / 20:02

Tags