На работе у нас есть суперкомпьютер, доступный через 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
предназначен для завершения сценария, но мне нужно выйти терминального сеанса после завершения работы рассматриваемого приложения.
Итак, что я могу сделать, чтобы принудительно закрыть «псевдотерминал» после выхода из приложения?
Самый простой способ в оболочке, предоставляемой командой bsub
, - это добавить префикс к любой команде, которую вы должны запустить. exec
, который представляет собой встроенную оболочку, которая заменит предоставленную оболочку вашим решателем:
exec yoursolver
Когда yoursolver
завершится, он вернется в bsub
, поскольку оболочка уже давно заменена решателем.
(В стороне, обратите внимание, что в некоторых языках (TCL, PHP) есть exec
, который совсем не похож на оболочку или Perl exec
или функции C exec (3)
, поэтому, если вы используете или знакомы с этими языками, остерегайтесь этой разницы; версии TCL и PHP больше похожи на систему C (3)
или функция Perl system
или ввод команд в оболочку, в которой исходный процесс все еще существует.)