Деактивировать системный сервис после простого времени

У меня сработало:

  • Используя клавиатуру на компьютере «A» (то есть физическом компьютере, которым нужно управлять), выполните: screen -q

  • Подключиться с помощью ssh с компьютера «B» на компьютер «A». ".

  • В сеансе ssh введите: screen -ls , чтобы получить идентификатор сеанса для подключения (4 цифры в строке, содержащей tty ).

  • Подключитесь к вышеуказанному сеансу с помощью: screen -x ... используя номер идентификатора сеанса, полученный из приведенной выше команды screen -ls .

Все, что введено в любом «сеансе», произойдет в обоих «сеансах», поэтому, например, ввод screen -d приведет к выходу ОБЕИХ сеансов.

4
26.09.2018, 18:35
2 ответа

Активация сокета в systemd может работать в двух режимах:

  • Accept=true:systemd сохраняет прослушиваемый сокет, принимает каждое входящее соединение, порождает новый процесс для каждого соединения и передает ему установленный сокет. Этот случай тривиален (каждый процесс завершается, когда он завершен ).
  • Accept=false:systemd создает прослушивающий сокет и отслеживает входящие соединения. Как только он появляется, systemd запускает службу и передает ей прослушивающий сокет. Затем служба принимает входящее соединение и любые последующие. Systemd больше не отслеживает, что происходит в сокете, поэтому не может обнаружить бездействие.

В последнем случае я думаю, что единственным по-настоящему правильным решением является модификация приложения, чтобы оно закрывалось, когда оно бездействует в течение некоторого времени. Если ты не можешь этого сделать,Грубый обходной путь может состоять в том, чтобы настроить таймер cron или systemd для остановки службы один раз в час. Это может быть разумным приближением, если сервис запускается очень редко.

Обратите внимание, что вариант использования, вероятно, встречается довольно редко. Процесс, находящийся в опросе ()/select ()и ожидающий подключения, не потребляет процессорного времени, поэтому единственным ресурсом, который используется в этой ситуации, является память. Вероятно, проще и эффективнее просто настроить некоторый своп и позволить ядру решить, стоит ли держать процесс в ОЗУ все время или нет.

5
27.01.2020, 20:59

Если ваш сервис можно активировать через сокет, вы можете использовать Accept=yesв блоке сокетов. Тогда новый экземпляр вашей службы будет выполняться для каждого соединения и останавливаться при закрытии сокета.

1
27.01.2020, 20:59

Теги

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