Наверняка на ваших виртуалках крутится некоторое количество программ, стабильное функционирование которых имеет особую важность. Тому, чтобы такой софт работал без перерывов на протяжении длительного времени, может помочь автоматический запуск критически важных приложений. Ниже покажем, как настроить автоматический запуск определённых программ на виртуальных серверах, а также, что можно предпринять, если какие-нибудь некорректно работающие приложения закрываются после завершения сессии удалённого управления сервером.
Автозапуск приложений на серверах Windows
Для начала, на виртуальном сервере, работающем под управлением ОС Windows, необходимо настроить автоматический вход в систему. Для этого нажмите Win R
, в открывшейся строке введите control userpasswords2
и нажмите OK
.
Далее, необходимо поставить галочку в строке Требовать ввод имени пользователя и пароля
(Users must enter a user name and password to use this computer
).
Затем необходимо набрать имя учётной записи, под которой будет осуществляться вход в систему, а также дважды пароль этого пользователя. Закончив ввод учётных данных нажмите OK
.
На следующем этапе добавьте приложение, которое вы планируете запускать автоматически при входе в систему. Чтобы это сделать, в проводнике перейдите по следующему адресу:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
После чего в данную директорию скопируйте ярлык необходимого приложения. В нашем случае мы положили в этот каталог ярлык Paint
.
После того, как вы произведёте данные действия, добавленное в автозагрузку приложение должно будет запускаться автоматически.
В общем случае, при закрытии окна сессии удалённого рабочего стола без выхода из системы, все работающие приложения будут продолжать функционировать. Если вы не планируете задавать явным образом ограничение времени сессии RDP, то данные программы будут продолжать работать, пока вы их не закроете, не выйдите из системы или не перезапустите свою виртуалку. Настройки временных лимитов находятся в свойствах пользователя. Для того, чтобы перейти к ним, наберите в командной строке lusrmgr.msc
в случае с локальной учёткой, либо перейдите в Active Directory - пользователи и компьютеры
в случае с пользователем домена.
Те же настройки можно произвести с помощью групповых политик. В этом случае запустите gpedit.msc
и перейдите в User Configuration → Administrative Templates → Windows Components → Remote Desktop Services → Remote Desktop Session Host → Session Time Limits
.
О некоторых приложениях
В некоторых случаях может происходить так, что запущенные приложения завершают свою работу при отключении сеанса удалённого рабочего стола. Такая проблема имеет своё решение. Заключается оно в следующем: в Параметрах
необходимо найти вкладку Power & sleep
и там установить опцию When plugged in, turn off after
в значение Never
.
После этого необходимо перед завершением сессии RDP запустить командную строку (cmd
).
В командной строке нужно набрать:
query session
Результатом выполнения данной команды станет список всех сессий, выполняющихся в данный момент на вашем сервере. В списке необходимо отыскать свою сессию, и подключиться к ней с помощью утилиты tscon
. Пример использования данной утилиты выглядит следующим образом:
tscon X /dest:console
Здесь X
— это идентификатор интересующей нас сессии. Этот самый идентификатор указывается в выводе команды query session
в поле ID
.
В результате, программы указанной сессии продолжат работать в фоновом режиме.
Но использование такого метода не является безопасным. Применять его следует исключительно в случаях крайней необходимости.
Автозапуск приложений на серверах Linux
На серверах, работающих под управлением операционных систем семейства Linux, для управления автозапуском используется система инициализации systemd
. Интерфейсом при работе с systemd
является команда systemctl
. Вот некоторые примеры применения данной команды:
$ sudo systemctl enable my-service
В данном случае команда systemctl
добавляет службу my-service
в автозагрузку.
$ sudo systemctl disable my-service
Здесь команда systemctl
удаляет службу my-service
из автозагрузки.
$ sudo systemctl is-enabled my-service
А здесь команда systemctl
проверяет наличие службы my-service
в автозагрузке.
Команда systemctl
также может использоваться для добавления в автозагрузку исполнительных сценариев (скриптов). Делается это созданием unit-файла, который в свою очередь необходимо так же добавить в автозагрузку.
Пример команды создания unit-файла выглядит следующим образом:
$ cd /lib/systemd/system
$ sudo vi my-script.service
В данном примере my-script.service
— имя создаваемого unit-файла. Его содержимое выглядит примерно так:
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/local/my-script.sh
[Install]
WantedBy=multi-user.target
В данном случае:
Description
– описание скрипта;After=multi-user.target
означает, что запуск скрипта производится во многопользовательском режиме;Type=idle
говорит о том, что служба будет запущена после отправки всех заданий;ExecStart=/usr/bin/local/my-script.sh
– место расположения скрипта.
Для того, чтобы скрипт смог запуститься на исполнение, ему нужно добавить необходимые права:
$ sudo 644 my-script.service
Далее, следует перезапустить систему инициализации:
$ sudo systemctl daemon-reload
И наконец, нужно добавить наш скрипт в автозагрузку:
$ sudo systemctl enable my-script.service
Теперь my-script.service
будет автоматически запускаться при загрузке операционной системы.
И ещё о некоторых приложениях
Так же, как и на Windows-серверах, на серверах, работающих на Linux, существует проблема некоторых приложений, которые прекращают свою работу при завершении сеанса удалённой работы на сервере. В данном случае речь идёт, конечно же, о подключении по SSH. И, естественно, такая проблема имеет решение.
Во-первых, можно перевести процесс в фоновый режим при помощи команды nohup
. Команда nohup
умеет блокировать сигнал SIGHUP
, который получают процессы при завершении сессии SSH. Пример написания данной команды выглядит так:
$ sudo nohup /lib/systemd/system/my-script.service &
Обратите внимание на символ &
. Как раз он-то и означает, что процесс будет работать в фоновом режиме.
Ещё одним методом решения проблемы является команда setsid
. Она может создать новую сессию в случае, когда вызывающий процесс — не ведущий в группе процессов. Вызывающий процесс становится ведущим и единственным в новой сессии и в новой группе процессов. Как правило, новая сессия не имеет терминала, который её контролирует. Но при всём при том, ID
сессии и ID
группы процессов – это то же, что и ID
процесса.
Если вернутся к нашему скрипту, то команду setsid
можно использовать со следующими опциями:
$ sudo setsid /lib/systemd/system/my-script.service
Здесь скрипт запускается в новой сессии.
$ sudo setsid -c /lib/systemd/system/my-script.service
В данном случае с помощью setsid
управляющий терминал устанавливается в текущий.
$ sudo setsid -w /lib/systemd/system/my-script.service
А здесь устанавливается ожидание завершения работы скрипта и возвращается его выходное значение в качестве возвращаемого значения команды setsid
.
$ sudo setsid -V
Такая команда возвращает версию команды setsid
.
$ sudo setsid -h
А таким образом можно вызвать небольшой help
для команды setsid
.