Fechando um terminal de um aplicativo que foi iniciado nesse terminal

Fechando um terminal de um aplicativo que foi iniciado nesse terminal

No trabalho temos um supercomputador acessível via SSH.

Fazemos login, reservamos os núcleos usando bsubcomando com parâmetros, e este último cria (do documento) "uma sessão bash interativa com pseudo-terminal".

Nesse "pseudo-terminal" vamos então para uma pasta, iniciamos o solucionador com parâmetros e deixamos ele rodar até o fim.

Assim, o aplicativo é concluído e a sessão permanece aberta, e os núcleos reservados permanecem reservados, e alguns dias depois (se o sim terminou na sexta-feira depois do trabalho), a TI envia um e-mail na segunda-feira informando que os núcleos estão reservados, mas não vê nenhuma atividade , blá blá blá...

Eu verifiqueihttps://stackoverflow.com/questions/14254118/waiting-for-background-processes-to-finish-before-exiting-scripteBash - como executar um comando após a conclusão do anterior?e outros fóruns/tutoriais, mas tudo que encontro é como manter um aplicativo em execução após fechar o terminal (desconectar o aplicativo de um terminal).

Eu preciso do contrário, quero fechar o terminal (este pode ser o último passo do solucionador, para que ele possa sair do terminal e ser morto)

Estou aberto a sugestões, posso fazer isso em um script ou posso fazer com que o cara codifique em seu solucionador C++.

Eu tentei o seguinte (no meu servidor Ubuntu rodando em uma VM, espero que funcione mais ou menos da mesma forma em qualquer bashambiente, corrija-me se estiver errado):

atraso_teste.c:

#include <stdio.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    printf("Doing some fake lengthy operation...");
    sleep(15); // sleep for 15 seconds
    return 0;
}

Compila e executa conforme o esperado. Tentei system("clear");(parte de stdlib.h) antes de retornar e também funciona, recebo a mensagem e, 15 segundos depois, a tela é limpa e o aplicativo é encerrado.

Então tentei system("exit");e nada aconteceu (quero dizer, o aplicativo sai como se aquela exitdeclaração não estivesse lá...). Meu melhor palpite é que o aplicativo precisa retornar antes que alguém possa sair do terminal, mas é apenas um palpite.

Eu também tentei uma maneira de script:

teste.sh:

#!/bin/bash
./delay_test &
wait
exit

Nesse caso, meu entendimento me diz que a exitinstrução é para finalizar o script, mas preciso sair da sessão do terminal assim que o aplicativo em questão terminar.

Então, o que posso fazer para forçar a saída do "pseudo-terminal" após a saída do aplicativo?

Responder1

A maneira mais direta no shell fornecido pelo bsubcomando é prefixar qualquer comando que você deseja executar exec, que é um shell integrado que substituirá o shell fornecido pelo seu solucionador:

exec yoursolver

Quando yoursolversair, ele retornará para bsub, já que o shell já foi substituído pelo solucionador.

(Como um aparte, observe que algumas linguagens (TCL, PHP) possuem um execque é não gosto nadao shell ou Perl execou as exec(3)funções C, portanto, se você estiver usando ou estiver familiarizado com essas linguagens, tome cuidado com essa diferença; as versões TCL e PHP são mais parecidas com a função C system(3)ou Perl systemou com a digitação dos comandos em um shell, pois o processo original ainda estará disponível posteriormente.)

informação relacionada