У меня сработало:
Используя клавиатуру на компьютере «A» (то есть физическом компьютере, которым нужно управлять), выполните: screen -q
Подключиться с помощью ssh
с компьютера «B» на компьютер «A». ".
В сеансе ssh введите: screen -ls
, чтобы получить идентификатор сеанса для подключения (4 цифры в строке, содержащей tty ).
Подключитесь к вышеуказанному сеансу с помощью: screen -x
... используя номер идентификатора сеанса, полученный из приведенной выше команды screen -ls
.
Все, что введено в любом «сеансе», произойдет в обоих «сеансах», поэтому, например, ввод screen -d
приведет к выходу ОБЕИХ сеансов.
Активация сокета в systemd может работать в двух режимах:
Accept=true
:systemd сохраняет прослушиваемый сокет, принимает каждое входящее соединение, порождает новый процесс для каждого соединения и передает ему установленный сокет. Этот случай тривиален (каждый процесс завершается, когда он завершен ). Accept=false
:systemd создает прослушивающий сокет и отслеживает входящие соединения. Как только он появляется, systemd запускает службу и передает ей прослушивающий сокет. Затем служба принимает входящее соединение и любые последующие. Systemd больше не отслеживает, что происходит в сокете, поэтому не может обнаружить бездействие. В последнем случае я думаю, что единственным по-настоящему правильным решением является модификация приложения, чтобы оно закрывалось, когда оно бездействует в течение некоторого времени. Если ты не можешь этого сделать,Грубый обходной путь может состоять в том, чтобы настроить таймер cron или systemd для остановки службы один раз в час. Это может быть разумным приближением, если сервис запускается очень редко.
Обратите внимание, что вариант использования, вероятно, встречается довольно редко. Процесс, находящийся в опросе ()/select ()и ожидающий подключения, не потребляет процессорного времени, поэтому единственным ресурсом, который используется в этой ситуации, является память. Вероятно, проще и эффективнее просто настроить некоторый своп и позволить ядру решить, стоит ли держать процесс в ОЗУ все время или нет.
Если ваш сервис можно активировать через сокет, вы можете использовать Accept=yes
в блоке сокетов. Тогда новый экземпляр вашей службы будет выполняться для каждого соединения и останавливаться при закрытии сокета.