У нас на работе есть суперкомпьютер, доступный по 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) есть exec
that совсем не похоже(Оболочка, функции Perl exec
или C exec(3)
, поэтому, если вы используете или знакомы с этими языками, учтите эту разницу; версии TCL и PHP больше похожи на функции C system(3)
или Perl system
или на ввод команд в оболочку, поскольку исходный процесс после этого все еще сохраняется.)