Вопрос или проблема
Я пытаюсь выполнить программу с помощью xterm, а затем закрыть xterm с работающей программой, но кажется, это не работает так, как я ожидал.
В bash есть опция bash -c [команда]
, есть ли что-то подобное в xterm? В настоящее время я использую xterm -e [команда]
, но это оставляет окно xterm открытым, пока моя программа не завершится. Но я хочу открыть его, запустить программу, закрыть и продолжать работу программы.
Почему я хочу, чтобы программа запускалась через xterm, если я ее даже не использую? Я вызываю это через xpra на другом компьютере, но невозможно просто запустить программу, потому что мне нужно это с окружением на другом ПК.
Есть ли способ сделать это?
Я не думаю, что вам нужен xpra
. ssh
– хороший выбор
ssh user@hostname /path/to/program
или ssh
+ screen
ssh user@hostname "screen /path/to/program"
или xpra
+ screen
xpra user@hostname "screen /path/to/program"
Похоже, вы путаетесь в том, как все работает. Вам не нужен терминал для запуска программы.
“Запустить xterm
, чтобы вы могли запустить процесс, а затем выйти из xterm
” сводится к “запустить процесс”, и вы можете полностью исключить xterm
.
Думаю, вы ищете
nohup command >command.out 2>command.err &
что запускает command
как фоновый процесс (из-за &
) с выводом в command.out
и сообщениями об ошибках в command.err
.
Если вас не волнует вывод или обработка сигналов с nohup
, вы можете просто захотеть
command &
Это не позволяет вам взаимодействовать с фоновым процессом (но закрытие xterm
также этого не позволяет, так что, думаю, вам это не нужно); если вы хотите иметь возможность это делать, рассмотрите screen
или tmux
, которые позволяют запускать программу в виртуальном терминале, с которым вы можете отключаться и подключаться позже.
Ответ или решение
Для решения задачи, описанной в вашем вопросе, необходимо сначала понять, как работает терминал xterm и что происходит, когда вы запускаете программу в нем. Основная цель состоит в том, чтобы запустить программу внутри xterm, затем закрыть его, но оставить программу работающей. Здесь мы рассмотрим различные подходы и техники, которые помогут достичь данной цели.
Теория
Xterm — это эмулятор терминала для системы X Window, который часто используется в UNIX-подобных системах для запуска различных команд и программ. Когда вы запускаете команду с помощью xterm -e [команда]
, xterm открывается, исполняет указанную команду и остается открытым до завершения программы. Это происходит потому, что xterm в своем стандартном режиме работы "привязан" к процессу, который он запускает, и закрывается только после завершения этого процесса.
Для достижения вашей цели — запустить программу и закрыть xterm, оставив программу работающей — нужно использовать подходы, которые позволят разорвать связь между жизненным циклом xterm и самой программой. Это можно сделать с помощью утилит и техник, таких как nohup
, фоновые процессы, и менеджеры сеансов вроде screen
или tmux
.
Пример
-
Использование
nohup
:nohup
защищает процесс от сигналов HUP (hangup, сигнал обрыва соединения), которые обычно отправляются терминалу при его закрытии. Таким образом, процесс продолжит работать даже после закрытия xterm.xterm -e "nohup [команда] > output.log 2>&1 &"
Здесь
nohup [команда] > output.log 2>&1 &
запускает вашу программу в фоновом режиме, перенаправляя стандартный вывод и ошибки в файлoutput.log
. Символ&
гарантирует, что процесс будет запущен в фоновом режиме. -
Использование
screen
илиtmux
: Эти утилиты позволяют запустить вашу программу в отдельной сессии, от которой можно отключиться и позже подключиться. Это подход особенно удобен для удаленного управления.Сначала установите
screen
илиtmux
, если они еще не установлены. Затем используйте:xterm -e "screen -dmS mysession [команда]"
Эта команда создаст новый экранный сеанс с именем
mysession
, в котором запустится ваша команда. У xterm теперь нет необходимости оставаться открытым, потому что программа фактически запускается в сеансеscreen
, который работает в фоновом режиме.
Применение в Задаче
Вам, возможно, кажется, что использование xterm необходимо из-за специфики запуска на другой машине с помощью xpra
. Однако зачастую проще исключить использование xterm и работать напрямую через SSH или другие инструменты, способные управлять окружениями.
-
SSH и запуск программы напрямую:
Использование SSH для удаленного запуска программы без необходимости использования графической среды или xterm может быть более простым решением. Пример команды:
ssh user@hostname "nohup /path/to/program > /dev/null 2>&1 &"
Здесь
nohup
гарантирует продолжение выполнения программы после завершения сеанса SSH. -
Удаленное использование
screen
илиtmux
:Позволяет запускать программы так, чтобы они продолжали выполнения, даже если соединение будет разорвано:
ssh user@hostname "screen -dmS mysession /path/to/program"
Или эквивалентная команда с использованием
tmux
:ssh user@hostname "tmux new-session -d -s mysession /path/to/program"
Таким образом, хотя изначальные требования могли казаться состоящими в необходимости использования xterm, зачастую удобнее и эффективнее избежать от него в пользу более прямых и гибких решений.Обратите внимание на использование утилит в зависимости от специфических требований к управлению процессами и окружениями. Это может значительно упростить задачу и сделать управление процессами более надежным и предсказуемым.