Запустите сценарий на удаленном хосте, не беспокоясь о сеансе ssh

У меня есть скрипт Python в папке на удаленном компьютере. Для его выполнения я создаю сеанс ssh со своего локального компьютера, перехожу в эту папку и запускаю.

Команды, которые я использую:

ssh remotehost
user@remotehost:~$ cd /my/folder
user@remotehost:~$ python abc.py >> abc.log

Теперь проблема в ssh-сеансе. Сценарий занимает много времени, и из-за проблем с Интернетом сеанс ssh завершается, а сценарий не завершается. Предположим, что пульт всегда включен и работает.

Могу ли я запустить сценарий, не заботясь о завершении сеанса ssh, и выполнить tail -f abc.log с ssh в любое время, когда захочу?

Ищите эмулятор терминала. В частности, запустите вашу команду внутри tmux.

William Pursell 13.09.2018 20:13

Извините, я могу чего-то упустить, но это кажется простым и должно помочь. user@remotehost:~$ python abc.py >> abc.log &, затем вы можете нажать Enter и Ctrl + d, чтобы выйти из ssh вручную, и скрипт продолжит работу.

Işık Kaplan 13.09.2018 20:35
2
2
4 728
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это зависит от того, какие инструменты установлены на удаленном компьютере, к которому вы подключаетесь. Мне известны два основных инструмента: GNU screen и tmux. Я использую экран, поэтому я дам вам некоторые основы того, как вы его используете. Вы можете начать как обычно и войти в сеанс экрана перед выполнением вашего скрипта Python:

ssh remotehost
user@remotehost:~$ cd /my/folder
user@remotehost:~$ screen
user@remotehost:~$ python abc.py >> abc.log

Затем вы можете отключиться от сеанса экрана, и скрипт python продолжит работу, даже если ваше соединение ssh потеряно.

Чтобы отсоединить:

Нажмите Ctrl-A и d

Для повторной привязки:

screen -r

Чтобы перечислить сеансы экрана:

screen -ls

Чтобы завершить текущий сеанс экрана:

Нажмите Ctrl-d

У экрана гораздо больше функциональных возможностей. Это хороший ресурс для начала:

Более подробную информацию см. В руководстве:

Ответ принят как подходящий

Вы можете запустить сценарий либо на экране, либо запустить процесс в nohup + bg. Я всегда предпочитаю Screen, но позвольте мне объяснить оба метода.

1. nohup

Вы можете использовать команду nohup для запуска процесса, отсоединившись от терминала, как этот nohup python /my/folder/abc.py & По умолчанию создается файл nohup.out, в котором будут храниться все журналы. Если вам нужен собственный файл, вы можете использовать перенаправление, тогда это будет nohup python /my/folder/abc.py >> abc.log &.

В одиночной команде это будет

ssh user@remotehost 'nohup python /my/folder/abc.py >> abc.log &'

википедия nohup

2. Screen

Из документации.

Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells. Each virtual terminal provides the functions of the DEC VT100 terminal and, in addition, several control functions from the ISO 6429 (ECMA 48, ANSI X3.64) and ISO 2022 standards (e.g. insert/delete line and support for multiple character sets). There is a scrollback history buffer for each virtual terminal and a copy-and-paste mechanism that allows the user to move text regions between windows.

When screen is called, it creates a single window with a shell in it (or the specified command) and then gets out of your way so that you can use the program as you normally would. Then, at any time, you can create new (full-screen) windows with other programs in them (including more shells), kill the current window, view a list of the active windows, turn output logging on and off, copy text between windows, view the scrollback history, switch between windows, etc. All windows run their programs completely independent of each other. Programs continue to run when their window is currently not visible and even when the whole screen session is detached from the user's terminal.

Руководство по экрану

Таким образом, вы можете напрямую запустить скрипт на экране с помощью ssh, а затем вы можете просматривать журналы, когда это необходимо, либо прикрепив их к экрану, либо вы можете перенаправить журналы в какой-либо файл напрямую или перенаправить как в файл, так и на выход, используя tee.

Запустите команду на экране и распечатайте вывод в stdout (терминал).

ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py; exec bash")'

Запустите команду на экране и перенаправьте вывод в файл.

ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py >> abc.log &2>1; exec bash")'

Запустите команду на экране и перенаправьте вывод как в файл, так и на стандартный вывод (терминал).

ssh user@remotehost '(screen -dmS ScreenName bash -c "python /my/folder/abc.py &2>1 |tee abc.log; exec bash")'

Примечание. Во всех приведенных выше командах требуется exec bash, иначе экран закроется после завершения задания.

Любой из вышеперечисленных команд должен выполнить свою работу. Во всех вышеупомянутых случаях вы можете прикрепить экран ScreenName с помощью screen -r ScreenName и просматривать журналы. Я всегда рекомендую перенаправление stderr при перенаправлении в файл.

некоторые ссылки на использование экрана linux

  1. 10 примеров экранных команд для управления терминалами Linux
  2. Как использовать экран Linux

Другие вопросы по теме