No trabalho temos um supercomputador acessível via SSH.
Fazemos login, reservamos os núcleos usando bsub
comando 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 bash
ambiente, 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 exit
declaraçã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 exit
instruçã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 bsub
comando é prefixar qualquer comando que você deseja executar exec
, que é um shell integrado que substituirá o shell fornecido pelo seu solucionador:
exec yoursolver
Quando yoursolver
sair, 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 exec
que é não gosto nadao shell ou Perl exec
ou 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 system
ou com a digitação dos comandos em um shell, pois o processo original ainda estará disponível posteriormente.)