Закрытие терминала из приложения, которое было запущено в этом терминале

На работе у нас есть суперкомпьютер, доступный через SSH.

Мы войдите, зарезервируйте ядра, используя команду bsub с параметрами, и последняя создает (из документа) «интерактивный сеанс bash с псевдотерминалом».

Затем в этом «псевдотерминале» мы переходим к папку, запустите решатель с параметрами и дайте ему поработать до завершения.

Таким образом, приложение завершает работу, и сеанс остается открытым, а зарезервированные ядра остаются зарезервированными, затем через пару дней (если сим завершил работу в пятницу после работы) ИТ-отдел отправляет электронное письмо в понедельник, в котором говорится, что ядра зарезервированы, но они не видят активности, бла-бла-бла ...

Я проверил https://stackoverflow.com/questions/14254118/waiting-for -background -cesses-to-finish-before-exiting-script и Bash - как запустить команду после завершения предыдущего? и другие форумы / учебные пособия, но все, что я нахожу, - это как сохранить работу приложения после закрытия терминала (отсоединения приложения от терминала).

Мне нужно обратное, я хочу закрыть терминал (это может быть последний шаг решателя, чтобы он мог выйти из терминала и быть убитым)

Я открыт для предложений, я могу сделать это в скрипт, или я могу заставить парня закодировать его в его решателе C ++.

Я пробовал следующее (на моем сервере Ubuntu, работающем в виртуальной машине, ожидайте, что это будет работать более или менее одинаково в любой среде bash , поправьте меня, если я ошибаюсь):

delay_test.c:

#include 
#include 

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

Компилируется и запускается должным образом. Я попробовал system ("clear"); (часть stdlib.h ) перед тем, как вернуться, и это тоже работает, я получаю сообщение, затем через 15 секунд экран очищается и приложение закрывается.

Затем я попробовал system ("exit"); , но ничего не произошло (я имею в виду, что приложение закрывается, как если бы этого оператора exit там не было ...). Я предполагаю, что приложение должно вернуться, прежде чем можно будет выйти из терминала, но это только предположение.

Я также пробовал использовать сценарий:

test.sh:

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

В этом случае я понимаю, что оператор exit предназначен для завершения сценария, но мне нужно выйти терминального сеанса после завершения работы рассматриваемого приложения.

Итак, что я могу сделать, чтобы принудительно закрыть «псевдотерминал» после выхода из приложения?

0
23.05.2017, 15:39
1 ответ

Самый простой способ в оболочке, предоставляемой командой bsub , - это добавить префикс к любой команде, которую вы должны запустить. exec , который представляет собой встроенную оболочку, которая заменит предоставленную оболочку вашим решателем:

exec yoursolver

Когда yoursolver завершится, он вернется в bsub , поскольку оболочка уже давно заменена решателем.

(В стороне, обратите внимание, что в некоторых языках (TCL, PHP) есть exec , который совсем не похож на оболочку или Perl exec или функции C exec (3) , поэтому, если вы используете или знакомы с этими языками, остерегайтесь этой разницы; версии TCL и PHP больше похожи на систему C (3) или функция Perl system или ввод команд в оболочку, в которой исходный процесс все еще существует.)

1
28.01.2020, 02:47

Теги

Похожие вопросы