Como descartar um processo de outro shell

1

Para evitar que um processo pare ao sair do shell, você pode iniciar o comando via nohup ou screen Também é possível descartar um processo existente com os seguintes comandos

mycommand
CTRL-Z
bg
disown %1

Mas isso pode ser lançado apenas a partir do shell atual.

Eu gostaria de fazer a mesma coisa usando outra sessão shell / ssh (comando iniciado no shell A, mas deserdado lançado em outro shell)

Colocar o processo no backgroung de outro shell é possível:

CTRL-Z can be done via kill -20 PID (SIGSTP)
bg can be done via kill -18 PID (SIGCONT)

Mas o processo ainda pertence ao shell inicial ...

Como rejeitar o processo de outro shell.

Estou usando o linux 4.15

    
por Golgot 01.08.2018 / 15:11

2 respostas

1

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.

Leitura adicional

por 01.08.2018 / 17:39
0

Se você estiver no Solaris, pode ligar:

nohup -p <pid>

Isso remove o terminal de controle atual e conecta o stdout a um arquivo no sistema de arquivos.

Para poder fazer isso, você precisa ter suporte do kernel (neste caso, o sistema de arquivos / proc). O suporte ao programa nohup foi adicionado ao Solaris em 2001. Se outras plataformas puderem anexar depuradores a processos em execução de outros terminais, esse recurso poderá ser adicionado.

BTW: Se você olhar para o shell que estava executando o processo antes, poderá ver uma mensagem de erro "no children" da chamada wait () no shell.

Atualmente, não tenho conhecimento de construções semelhantes em outras plataformas.

    
por 01.08.2018 / 15:30