콘솔 애플리케이션인 systemd 서비스가 있습니다. 즉, stdin에 명령을 보내고 정보를 sdout에 출력하여 제어됩니다. 언제든지 표준 입력에 연결하고 명령을 내릴 수 있도록 systemd 서비스를 설정한 다음, 필요한 경우 분리하고 반복할 수 있도록 하려면 어떻게 해야 합니까?
답변1
이를 수행하는 여러 가지 방법을 생각할 수 있습니다. 물론 각각에는 고유한 주의 사항이 있습니다.
가장 간단한 접근 방식은 아마도 다음과 같이 전용 tty를 사용하여 간단한 서비스를 만드는 것입니다.
# /etc/systemd/system/systemd-interactive-simple-tty.service [Unit] Description=Example systemd interactive simple tty service After=getty.service [Service] # https://www.freedesktop.org/software/systemd/man/systemd.exec.html ExecStart=/usr/local/sbin/systemd-interactive.bash StandardInput=tty-force TTYVHangup=yes TTYPath=/dev/tty20 TTYReset=yes # https://www.freedesktop.org/software/systemd/man/systemd.service.html Type=simple RemainAfterExit=false Restart=always RestartSec=5s [Install] WantedBy=default.target
위의 간단한 서비스에는 다음 옵션이 사용됩니다.
구성(원격으로) 텍스트 모드 가상 콘솔을 제어합니다. 이것이 아마도 최선의 선택일 것입니다(위의 tty 서비스 사용). 대부분의 확장 팩 저장소를 통해 사용할 수 있으며 다음과 같이 사용이 간단합니다.
conspy 20 # hit ESC+ESC+ESC (3 times quickly, to exit)
쉬프트/dev/ttyN처럼 작동
conspy
하지만 /dev/ttyN을 전면(로컬) 터미널로 만듭니다. 그것은의 일부이다지식 기반거의 모든 최신 Linux 배포판에 기본적으로 수집되어 설치됩니다. 그렇기 때문에 언급할 가치가 있다고 생각합니다. 주요 주의 사항chvt
은 포함된 키보드를 사용해야 한다는 것인데, 이는 원하는 것과 다를 수 있습니다. 위의 서비스 예시에서는chvt
다음과 같이 사용할 수 있습니다.chvt 20 # ALT+F1 to return to /dev/tty1
렙텔시스템 호출을 사용하여
ptrace(2)
PID를 통해 원격 프로그램에 연결합니다 . 이는conspy
&와는 완전히 다른 접근 방식 이지만chvt
위의 서비스 정의에도 적용됩니다.reptyr
실제로 "분리" 자체를 지원하지는 않는다는 점을 명심하세요 . termcap 지원도 그다지 강력하지 않습니다. 일반적reptyr
으로화면그리고/또는멀티플렉서이는 보다 원활한 "분리" 방법을 제공하기 때문에 기존 PID를 세션, 창 또는 분할창reptyr
으로 이동하기 위한 훌륭한 틈새 도구라고 생각합니다.screen
tmux
즉, 이 옵션은 비록 마지막이기는 하지만 여기에 넣었습니다. 왜냐하면 이 옵션은 or
reptyr
없이도 사용할 수 있기 때문입니다 . 주요 주의사항은 프로세스를 다른 쉘을 통해 다른 tty/pty에 다시 복사하는 대신 프로세스를 중단하는 경우(예: ^C)입니다. 프로세스에 인터럽트를 보내면 프로세스가 중단될 수 있습니다. 나머지는 여러분도 알고 계실 것입니다.screen
tmux
어쩌면 괜찮을 수도 있습니다. 특히 프로세스가 중요하지 않고 systemd 서비스가
Restart=always
위에 표시된 대로 구성되어 있다면 더욱 그렇습니다. 프로세스가 "중단"되면 systemd는 자동으로 프로세스를 다시 시작합니다(systemd의 또 다른 멋진 기능!). 또한 다른 값도 있습니다Restart
. YMMV.reptyr
다음과 같이 대부분의 확장 팩 저장소를 통해 사용 가능하며 사용할 수 있습니다.reptyr $(systemctl status systemd-interactive-simple-tty.service | grep Main\ PID | awk '{print $3}') # or just reptyr <pid>
또 다른 (더 복잡한 [더 많은 실패 가능성을 의미]) 접근 방식은 화면을 사용하여 다음과 같은 분기된 서비스를 만드는 것입니다.
# /etc/systemd/system/systemd-interactive-forking-screen.service [Unit] Description=Example systemd interactive forking screen service [Service] # https://www.freedesktop.org/software/systemd/man/systemd.exec.html ExecStartPre=-/usr/bin/screen -X -S ${SCREEN_TITLE} kill # [optional] prevent multiple screens with the same name ExecStart=/usr/bin/screen -dmS ${SCREEN_TITLE} -O -l /usr/bin/bash -c /usr/local/sbin/systemd-interactive.bash # https://www.freedesktop.org/software/systemd/man/systemd.service.html Type=forking Environment=SCREEN_TITLE=systemd-interactive RemainAfterExit=false Restart=always RestartSec=5s SuccessExitStatus=1 [Install] WantedBy=default.target
화면여러 프로세스에서 물리적 터미널을 재사용하는 전체 화면 창 관리자입니다. 첫 번째 간단한 옵션에 나열된 것보다 훨씬 더 복잡합니다. 개인적으로 저는 화면을 오랫동안 사용해왔고 대부분의 일에서 화면을 신뢰할 수 있을 만큼 편안함을 느낍니다. 이것은 매우 귀중한 도구입니다.
위의 것보다 가장 큰 장점은 좋은 termcap 지원입니다(tmux만큼 좋지는 않지만). 이는 백스페이스 키, 화살표 등이
conspy
또는 를 사용하는 것보다 더 잘 작동 한다는 것을 의미합니다reptyr
.screen
대부분 합격할 수 있다~에 따르면패키지 저장소이며 다음과 같이 사용할 수 있습니다.screen -r systemd-interactive # CTRL-A+D to detach
화면을 포크하는 것과 유사한 방법은 포크입니다
tmux
. systemd 서비스는tmux
systemd 서비스와 거의 동일합니다screen
. 하지만 시간이 늦었고 피곤하기 때문에 이에 대해서는 자세히 설명하지 않겠습니다. 응 난 사용하고 있어tmux
많은screen
(요즘) 이상 .사실 저는
tmux
지금 네오빔 창에서 이 글을 쓰고 있습니다. 그럼에도 불구하고 나는 그것을screen
오랫동안 사용했다. 내 경험과 의견으로는tmux
이와 같은 것은 약간 과잉입니다. 물론tmux
더 새롭고, 더 많은 기능을 갖고 있으며, 더 나은 쉘 멀티플렉서이지만screen
... 훨씬 더 복잡합니다. 추가적인 복잡성으로 인해 추가적인 불안정성이 발생합니다.게다가 적어도 나에게는
tmux
충돌이 화면보다 더 자주 발생합니다. 나는 스크린을 #2로 나열했습니다. 왜냐하면 만약 그것이 나라면 비슷한 것에 대해 아마도 #1을 와 비교할 것이기 때문입니다conspy
.계획에 따라 다릅니다. 명명된 파이프...systemd 서비스도 이를 지원합니다! 즉
StandardInput=/path/to/named/pipe|
...그리고 더.
답변2
나를 위한 더 쉬운 화면 솔루션:
장소:
/home/someUser/.config/systemd/user/some.service
콘텐츠:
[Unit]
Description=someServer
Wants=network.target
After=network.target
[Service]
ExecStart=screen -S screenName -D -m /home/someUser/startServer.sh
[Install]
WantedBy=default.target