서비스가 시작된 후 systemd는 stdin/stdout에 연결됩니다.

서비스가 시작된 후 systemd는 stdin/stdout에 연결됩니다.

콘솔 애플리케이션인 systemd 서비스가 있습니다. 즉, stdin에 명령을 보내고 정보를 sdout에 출력하여 제어됩니다. 언제든지 표준 입력에 연결하고 명령을 내릴 수 있도록 systemd 서비스를 설정한 다음, 필요한 경우 분리하고 반복할 수 있도록 하려면 어떻게 해야 합니까?

답변1

이를 수행하는 여러 가지 방법을 생각할 수 있습니다. 물론 각각에는 고유한 주의 사항이 있습니다.

  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
    

    위의 간단한 서비스에는 다음 옵션이 사용됩니다.

    1. 구성(원격으로) 텍스트 모드 가상 콘솔을 제어합니다. 이것이 아마도 최선의 선택일 것입니다(위의 tty 서비스 사용). 대부분의 확장 팩 저장소를 통해 사용할 수 있으며 다음과 같이 사용이 간단합니다.

       conspy 20 # hit ESC+ESC+ESC (3 times quickly, to exit)
      
    2. 쉬프트/dev/ttyN처럼 작동 conspy하지만 /dev/ttyN을 전면(로컬) 터미널로 만듭니다. 그것은의 일부이다지식 기반거의 모든 최신 Linux 배포판에 기본적으로 수집되어 설치됩니다. 그렇기 때문에 언급할 가치가 있다고 생각합니다. 주요 주의 사항 chvt은 포함된 키보드를 사용해야 한다는 것인데, 이는 원하는 것과 다를 수 있습니다. 위의 서비스 예시에서는 chvt다음과 같이 사용할 수 있습니다.

       chvt 20 # ALT+F1 to return to /dev/tty1
      
    3. 렙텔시스템 호출을 사용하여 ptrace(2)PID를 통해 원격 프로그램에 연결합니다 . 이는 conspy&와는 완전히 다른 접근 방식 이지만 chvt위의 서비스 정의에도 적용됩니다.

      reptyr실제로 "분리" 자체를 지원하지는 않는다는 점을 명심하세요 . termcap 지원도 그다지 강력하지 않습니다. 일반적 reptyr으로화면그리고/또는멀티플렉서이는 보다 원활한 "분리" 방법을 제공하기 때문에 기존 PID를 세션, 창 또는 분할창 reptyr으로 이동하기 위한 훌륭한 틈새 도구라고 생각합니다.screentmux

      즉, 이 옵션은 비록 마지막이기는 하지만 여기에 넣었습니다. 왜냐하면 이 옵션은 or reptyr없이도 사용할 수 있기 때문입니다 . 주요 주의사항은 프로세스를 다른 쉘을 통해 다른 tty/pty에 다시 복사하는 대신 프로세스를 중단하는 경우(예: ^C)입니다. 프로세스에 인터럽트를 보내면 프로세스가 중단될 수 있습니다. 나머지는 여러분도 알고 계실 것입니다.screentmux

      어쩌면 괜찮을 수도 있습니다. 특히 프로세스가 중요하지 않고 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>
      
  2. 또 다른 (더 복잡한 [더 많은 실패 가능성을 의미]) 접근 방식은 화면을 사용하여 다음과 같은 분기된 서비스를 만드는 것입니다.

    # /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
    
  3. 화면을 포크하는 것과 유사한 방법은 포크입니다 tmux. systemd 서비스는 tmuxsystemd 서비스와 거의 동일합니다 screen. 하지만 시간이 늦었고 피곤하기 때문에 이에 대해서는 자세히 설명하지 않겠습니다. 응 난 사용하고 있어tmux 많은screen(요즘) 이상 .

    사실 저는 tmux지금 네오빔 창에서 이 글을 쓰고 있습니다. 그럼에도 불구하고 나는 그것을 screen오랫동안 사용했다. 내 경험과 의견으로는 tmux이와 같은 것은 약간 과잉입니다. 물론 tmux더 새롭고, 더 많은 기능을 갖고 있으며, 더 나은 쉘 멀티플렉서이지만 screen... 훨씬 더 복잡합니다. 추가적인 복잡성으로 인해 추가적인 불안정성이 발생합니다.

    게다가 적어도 나에게는 tmux충돌이 화면보다 더 자주 발생합니다. 나는 스크린을 #2로 나열했습니다. 왜냐하면 만약 그것이 나라면 비슷한 것에 대해 아마도 #1을 와 비교할 것이기 때문입니다 conspy.

  4. 계획에 따라 다릅니다. 명명된 파이프...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

관련 정보