Terminus SSH 터미널을 사용하여 접속할 수 있는 서버를 임대합니다. 입력을 요청하고 받아들이며 정상적인 시작 시 예상대로 작동하는 프로그램을 만들었습니다. 하지만 시작 시 또는 충돌 시 자동으로 시작하는 서비스를 만들었지만 해당 서비스에서 시작하면 터미널에 출력이 인쇄되지 않거나 입력이 허용되지 않습니다.
유닛 파일에서 Standardinput과 Standardoutput을 비워두고 systemctl status 명령을 사용하면 프로그램이 시작될 때 인쇄되어야 하는 프롬프트를 볼 수 있지만 여전히 명령을 내릴 수는 없습니다.
나는 Standardinput과 Standardoutput을 tty로, tty-force로 설정하고 TTYPath를 /dev/pts/0으로 설정해 보았습니다. 왜냐하면 그것이 제가 사용하고 있는 tty이기 때문입니다. 이 작업을 수행하면 여전히 출력이 제공되지 않거나 입력이 허용되지 않고 systemctl status 명령을 사용할 때 부팅 출력도 제공되지 않습니다. /dev/console을 TTYPath로 사용할 때도 마찬가지입니다. 기본값이어야 한다고 읽었습니다. 따라서 표준 입력 또는 출력이 설정되지 않은 경우 systemd 상태에서 이러한 프롬프트가 표시되지만 /dev/console(기본값인 경우)로 설정된 경우에는 표시되지 않는 이유를 모르겠습니다.
또한 ptyp0, ptyp1, tty0, tty2 및 stdin/stdout과 같은 다른 여러 tty도 시도했지만 여전히 작동하지 못했습니다. 어떤 제안이 있으십니까?
SSH 터미널에 연결되어 있지 않을 때 연결을 시도하면 문제가 발생할 수 있다는 것을 알고 있습니다. 이 경우 열려 있는 가상 터미널을 설정하여 입력에 사용할 수 있는 방법이 있습니까? 출력, 그러면 SSH를 통해 로그인할 때마다 해당 터미널에 연결하시겠습니까?
가상 터미널을 만들고 SSH를 통해 연결하려면 어떻게 해야 합니까? chvt 0 및 chvt 1을 시도했지만 "콘솔을 참조하는 파일 설명자를 얻을 수 없습니다."라는 메시지가 표시되고 sudo su도 시도했지만 여전히 동일한 응답을 받았습니다.
단위코드입니다
Description= Makes sure server stays running
[Service]
Type=simple
TTYPath=/dev/pts/0
StandardInput=tty
StandardOutput=tty
ExecStart=/usr/lib/jvm/jdk-19/bin/java -cp /apps/server/lib/*:/apps/server/src packages/Server
Restart=always
RestartSec= 30
[Install]
WantedBy=default.target```
답변1
screen
이런 목적 으로 사용할 수 있습니다 . 예를 들어, ~/noisy.sh
실행 가능하게 만들어진 간단한 스크립트( )를 생각해 보십시오 chmod a+x ~/noisy.sh
. 귀하의 경우 이는 오랫동안 실행되는 복잡한 애플리케이션이 될 것입니다.
#!/bin/sh
while :
do
date
sleep 5
done
screen
아래와 같이 장기 실행 세션으로 연기할 수 있습니다.
screen -S myNoisy -md ~/noisy.sh
이를 통해 어떤 세션이 장기 실행 애플리케이션인지 -S <session_name>
식별할 수 있습니다 . 예제에서는 이를 사용했습니다 screen
. myNoisy
평소와 같이 를 사용하여 세션을 나열하고 을 screen ls
사용하여 이 세션에 연결한 다음 screen -r myNoisy
을 사용하여 다시 분리할 수 있습니다 Ctrl Ad.
코드를 자동으로 다시 시작하려면 대체 예제로 제공한 것과 같은 스크립트를 사용하되 와 사이에 한 줄을 삽입 date
하고 sleep 5
실제 코드를 호출하세요. 또는 screen
에서 실행되는 애플리케이션 으로 systemd
.