Invoca um comando / script desconectado do terminal de controle?

7

Estou investigando o comportamento de um script que normalmente é executado como um processo automatizado (por exemplo, cron, Jenkins). O script pode (eventualmente) invocar comandos que se comportam de maneira diferente (buscando entrada do usuário) quando executados interativamente; por exemplo, patch perguntará o que fazer com um patch invertido e svn solicitará senhas, mas preciso ver o que acontece quando elas são executadas de forma não interativa.

Persuadir patch de que não é interativo é bastante fácil; Eu só preciso redirecionar stdout para ser não-tty:

$ </dev/null > >(cat) /path/to/myscript --args

No entanto, svn se conectará ao terminal de controle, se existir; editar os scripts para passar --non-interactive não é realmente uma opção, pois isso vem de vários níveis de profundidade e seria difícil ter certeza de que encontrei todas as invocações.

Existe uma maneira de invocar um script / comando de forma não interativa, sem um terminal de controle (para que /dev/tty não exista)? Eu preferiria que o stdout / stderr ainda fosse para o meu terminal.

(Eu encontrei a pergunta Executar script em um shell não interativo? mas as respostas para isso discutem as diferenças entre o cron e o ambiente do usuário; eu já eliminei todas as diferenças, exceto a não-interatividade.

    
por ecatmur 20.03.2013 / 16:43

2 respostas

12

Você precisa iniciar outra sessão não anexada a um terminal, portanto, por exemplo:

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test

Veja também o comando start-stop-daemon encontrado em algumas distribuições do Linux. Há também um comando daemon .

    
por 20.03.2013 / 19:08
0

Você provavelmente desejará fazer um script esperado. Exemplo com SVN:

link

    
por 20.03.2013 / 16:52