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

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

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

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

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

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

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

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

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

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

delay_test.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;
}

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

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

Я также попробовал скриптовый способ:

тест.ш:

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

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

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

решение1

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

exec yoursolver

При yoursolverвыходе он вернется к bsub, так как оболочка уже давно заменена решателем.

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

Связанный контент