Como desanexar de um terminal de controle da linha de comando?

2

Eu sei nohupe não vai fazer o que eu quero:

Exemplo:

$ nohup sleep 600 2>/dev/null >/dev/null </dev/null&
[1] 21844
$ ps -ef | fgrep -e 'sleep
> TTY'
UID        PID  PPID  C STIME TTY          TIME CMD
me       21844 19313  0 09:37 pts/9    00:00:00 sleep 600

Como você pode ver, o sono ainda tem pts/9como um terminal de controle. Não quero que ele tenha nenhum terminal de controle. Em parte porque o programa que eu quero usar (não é sleepse você não adivinhou) tenta abrir o terminal de controle para me fazer perguntas e eu quero ver como ele se comporta se não puder. Como faço isso acontecer?

Omniforme
fonte

Respostas:

1

Esta é uma solução FreeBSD, mas talvez uma técnica semelhante funcione para o seu sistema operacional.

Eu sei que o cron não é exatamente a linha de comando, mas se você tiver uma lista de comandos específica que deseja executar, o cron poderá fazer isso. Você provavelmente evitará que o cron execute o trabalho repetidamente, talvez criando um wrapper em torno da lista de comandos desejada, algo como:

#!/bin/sh
[ -f /tmp/my-semaphore-file ] || {
  touch /tmp/my-semaphore-file
  my_command_stack > /dev/null 2>&1
}

Talvez não seja adequado para uso em produção, mas se você quiser apenas testar o desempenho de sua pilha de comandos sem um terminal de controle, isso será feito. O wrapper não permitirá que o cron execute o comando novamente até que você:

rm /tmp/my-semaphore-file

at(1) também é uma opção e é "quase" uma solução de linha de comando:

echo 'my_command_stack > /dev/null 2>&1' | at now+1 minute
Jim L.
fonte
Até at nowfunciona. Isso é melhor do que o meu "Você não pode fazer isso". responda.
onipotente
Uma resposta melhor para esta pergunta é setsid.
Omnifarious
1

O utilitário setsidno Linux pode fazer isso. No Fedora, faz parte do util-linuxpacote. Este é o mesmo pacote que contém coisas como mount, mkfs, /usr/bin/kill, e outras coisas semelhantes.

Omniforme
fonte
0

Você também precisa usar disownpara desanexar o processo do tty.

https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

Tente correr nohup sleep 600 2>/dev/null >/dev/null </dev/null& disowne veja se isso lhe dá o resultado desejado.

zymhan
fonte
Não, o sono ainda tem algo na TTYcoluna. Eu testei mesmo que não esperasse disownter efeito. Descartar o terminal de controle é algo que deve ser feito quando um processo é iniciado no AFAIK.
Onipotente 14/11
Ah, sim, olhando para este post, parece que o repúdio não corrige isso, afinal: superuser.com/questions/1196406/…
zymhan
Esta pequena linha de comando, ditty, resulta em um python3processo sem terminal de controle:sh -c 'nohup python3 -c "import os, time; time.sleep(5); os.setsid(); time.sleep(600)" &' </dev/null >/dev/null 2>/dev/null &
Omnifarious