Isso não é possível.
Bem, é se você está preparado para mexer com um depurador, e cutucar os componentes internos do processo executando o seu programa shell. Então, mais especificamente: isso não é possível de maneira simples e direta no nível da programação da shell.
Isso ocorre porque disown
afeta uma lista de "jobs" que o programa shell mantém no espaço de memória de cada processo de shell individual.
Shells (controle de jobs, isto é) lembram os processos filhos que eles criaram em suas "tabelas de tarefas" internas, até que eles sejam instruídos a esquecê-los por disown
ou os processos-filhos terminem e o shell tenha wait()
ed para eles e relatou o término do "trabalho". disown
não afeta o estado do processo filho de nenhuma forma . Isso afeta o que o shell faz.
Porque se esquece do processo disown
ed…
- … não reconhece mais a conclusão de um "job" quando
wait()
informa sobre o término da criança; - … não se importa mais se o processo ainda estiver em execução quando for informado para
exit
/logout
; e - … ele não envia mais um sinal de desconfiança para o filho quando recebe um sinal de desconexão em si (ou, no caso de alguns programas shell, quando ele sai e sabe que é um shell de login interativo).
Os shells não compartilham essas listas, e eles não são facilmente acessíveis (como, por exemplo, disparar um depurador e anexá-lo) de outros processos. Não há nenhum mecanismo de IPC ou ferramenta de linha de comando para acessá-los, exceto o comando disown
interno executado no próprio processo de shell relevante. (Isto é porque é um comando interno.)
É por isso que você não pode nem disown
jobs de um segundo shell, mesmo dentro da mesma sessão de login. disown
é inteiramente uma coisa por processo de shell por shell.
Além disso…
Putting the process in background from another shell is possible.
Na verdade, não é isso que você está fazendo.
A noção de primeiro plano e plano de fundo é relativa ao terminal de controle da sessão. Especificamente, existe um grupo de processos, conhecido pelo terminal de controle, que é o grupo de processos em primeiro plano. A interrupção e a continuação de processos, por si só, não alternam os processos entre primeiro plano e segundo plano. É necessário atualizar o grupo de processos de primeiro plano do terminal de controle também . Um processo em primeiro plano está apenas em primeiro plano por força de ser um membro desse grupo de processos em primeiro plano. Todos os outros grupos de processos nessa sessão e, portanto, os processos nesses grupos de processos, estão em segundo plano.
Ironicamente, você não fez isso de outro shell. O que você está fazendo é disparar o processo original do shell para agir . Ele vê o processo principal do grupo de processos de primeiro plano parar e ele ajusta o grupo de processos de primeiro plano do terminal (de volta ao seu próprio grupo de processos) em resposta.
O sinal certo é SIGTSTP
, a propósito.