Как я могу выполнить процесс в окне терминала и затем скрыть то окно?

Традиционный, портативный, наиболее часто используемый путь состоит в том, что родительский процесс следит за своими детьми.

Основные примитивы wait и waitpid системные вызовы. Когда дочерний процесс умирает, родительский процесс получает a SIGCHLD сигнал, говоря это это должно звонить wait знать, какой ребенок умер и его статус выхода. Родительский процесс может вместо этого принять решение проигнорировать SIGCHLD и звоните waitpid(-1, &status, WNOHANG) в его удобстве.

Для контроля многих процессов Вы или породили бы их всех от того же родителя или вызвали бы их на всем протяжении простого процесса контроля, который просто называет желаемую программу, ожидает ее для завершения и отчеты о завершении (в синтаксисе оболочки: myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe). Если Вы приезжаете из мира Windows, обратите внимание, что наличие небольших программ, делающих одну специализированную задачу, является общим умыслом в мире Unix, ОС разработана для создания процессов дешевыми.

Существуют, многие обрабатывают контроль (также названный супервизором) программы, которые могут сообщить, когда процесс умирает, и дополнительно перезапустите его и намного больше кроме того: Monit, Контролируйте, Выскочка, …

3
01.08.2011, 03:34
5 ответов

По моему скромному мнению, оптимальное решение состоит в том, чтобы выполнить тот прокси как системного демона.

Это учебное руководство из Романа должно преподавать Вам базовые понятия. К несчастью это немного центрально SuSE на других дистрибутивах, детали могли немного отличаться. Используйте его в качестве начальной точки.

P.S. Существует что-то странное в Вашем вопросе, сервис, запущенный при начальной загрузке, не имеет окна терминала. Программа, запущенная, когда Вы входите в систему, может иметь окно терминала. Возможно, сделайте у Вас есть активированная опция автовхода в систему, таким образом, Вы путаете процесс начальной загрузки с процессом входа в систему.

5
27.01.2020, 21:08

Более грубый подход должен записать простой сценарий, который переносит Вашу программу и отсоединяет ее от ее терминала. Что-то как:

#!/bin/bash

nohup python ~/program/proxy.py > ~/.proxy.log 2>&1 &

Затем можно поместить его в последовательность автозапуска входа в систему (как Вы, вероятно, уже сделанный).

4
27.01.2020, 21:08
  • 1
    posix nohup не называет setsid () (некоторые реализации делают), Вы только изолировали сигнал, это находится все еще в той же группе –  symcbean 03.08.2011, 18:56
  • 2
    Да, @symcbean, Вы правы. Очевидно, я предпочитаю свой другой ответ. Этот ответ является только быстрой и грубой альтернативой. Это также не берет в учетной записи, которые, если Вы выходите из системы и затем (ре), входят в систему, Вы выполните два экземпляра прокси. –  andcoz 04.08.2011, 02:07
  • 3
    согласовал запись, что демон будет лучшим подходом, но 'отзываются эхом,/usr/bin/python ~/program/proxy.py | в теперь' является быстрым исправлением. –  symcbean 08.08.2011, 23:04

Используя tmux можно запустить отдельный процесс, который эффективно "скрыт", и присоедините его для проверки его состояния, как и когда Вам нравится. При запуске его с терминала можно даже закрыть тот терминальный сеанс и впоследствии присоединить к tmux процессу Python от другого терминала...

Этот пример использование watch как команда, чтобы работать, но просто заменить Вашей командой Python... Это уже запускает tmux сессию в deteched состояние.

tmux new -d 'watch -n 1 -d date'

Для просмотра текущего состояния "скрытой" (отдельной) сессии просто введите tmux attach в Окне терминала...

Можно также использовать screen, но я верю tmux может быть лучший выбор, на основе комментариев в этом ответе Unix-&-Linux...

4
27.01.2020, 21:08

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

Однако я рекомендовал бы, чтобы Вы пошли с ответом andcoz и запустили эту программу как систему dæmon. Имейте вывод, переходят к файлу журнала. Единственный путь, который не работал бы, состоит в том, если это была интерактивная программа, но звуками его, мы не говорим об интерактивной программе.

* Правовая оговорка: Я - специалист по обслуживанию AllTray

1
27.01.2020, 21:08

В зависимости от того, как рано вы хотите запустить эту конструкцию, вы можете использовать cron @reboot.

(Возможно, вам понадобится поиграть с переменными окружения.)

Затем оберните его в отдельный терминал.

tmux new -d '/path/to/python /full/path/program/proxy.py'
# or #
screen -d -m '/path/to/python /full/path/program/proxy.py'

По сути, они привязаны к синтетическим терминалам.

Это обычно делается для серверного процесса "mickey mouse", такого как "sinatra" или "minecraft" или даже безголовое "складывание дома".

Для аккуратности/контроля вы можете использовать сценарий командной строки, который завершает запуск и вызывает , который от cron.

0
27.01.2020, 21:08

Теги

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