추가 읽기

추가 읽기

컴퓨터에서 플래시 카드를 물리적으로 제거하지 않고 사용자가 종료하거나 재부팅하는 것을 방지하려고 합니다. 이를 위해 저는 SystemD 서비스인 Removeflash.service를 작성했습니다.

[Unit]
Description=Prompt user to remove flash card

[Service]
ExecStop=/usr/lib/systemd/flashshutdown.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Requires=rsyslog.service

flashshutdown.sh는 다음과 같은 bash 스크립트입니다.

#! /bin/bash
#
while [ -e /dev/flash ] ; do
    echo "Please remove flash card"
    logger "GHB: Please remove flash card"
    sleep 5
done

에코가 꺼져 있을 때 아무 작업도 수행하지 않을 것이라고 예상했는데 그렇지 않습니다. 그러나 logger 명령이 작동하기를 원합니다. Requires=rsyslog.service가 없으면 rsyslog.service가 종료된 후 서비스가 종료되었습니다. 이러한 일이 발생하지 않도록 요구 사항을 삽입했지만 유일한 차이점은 Removeflash.service의 종료가 종료 순서에서 더 일찍 이루어진다는 것입니다. 다행스럽게도 systemd 자체가 사용자에게 플래시 카드를 제거하라는 작업을 실행 중임을 나타내는 메시지를 콘솔에 출력한다는 사실로 인해 서비스의 목적이 유지되었습니다.

콘솔에 메시지를 보내는 올바른 방법은 무엇입니까?

답변1

서비스 관리(s6, runit, perp, daemontools, nosh 서비스 관리 또는 systemd) 하의 서비스의 표준 출력 및 오류는 콘솔이 아닙니다. 이는 일종의 로그 기록기에 연결된 파이프입니다.

systemd 서비스의 경우 변경하려면 a 및 a를 사용하여 .INI 파일에서 TTYPath=/dev/console이 설정을 변경 해야 합니다.StandardOutput=ttyStandardInput=tty읽다(그러나 당신은 그렇지 않습니다) 그리고 글을 씁니다. 증인 시스템이 사전 제공됩니다 debug-shell.service.

이는 일반적인 원칙이지 구체적으로 체계화된 것은 아닙니다. 데몬 컨텍스트에는 (무엇보다도) 관련이 있습니다.아니요제어 터미널이 있고 터미널에 대해 열려 있는 파일 설명자가 없으며 적절한 서비스 관리(예: 모든 daemontools 제품군) 하에 있는 것은다음으로 시작됨, 감독자/서비스 관리자가 서비스 프로세스를 포크할 때 서비스 프로세스가 시작되는 상태입니다. 따라서 콘솔을 사용하려면 서비스에서 콘솔을 명시적으로 열어야 합니다.

systemd에서 위 TTYPath설정으로 StandardInput인해 서비스 프로그램이 제대로 실행되기 전에 분기된 하위 프로세스가 콘솔을 열게 됩니다. systemd 내부에 숨겨져 있으므로 실제로 볼 수는 없습니다. runnosh 서비스형 프로그램 에서 run프로그램은 일부 nosh 도구 세트 체인로더를 명시적으로 사용하여 기본 프로그램을 실행하기 전에 동일한 작업을 수행합니다( emergency-login이 경우):

%cat/etc/service-bundles/services/emergency-login@console/service/run
#!/빈/노쉬
#긴급 슈퍼유저 로그인 콘솔
설정값
vc-get-tty 콘솔
오픈 컨트롤 tty
vc-reset-tty --하드 리셋
line-banner "긴급 모드 로그인."
긴급 로그인
%

logger아이러니하게도 해당 명령이나 syslog 종속성이 필요하지 않습니다 . 이 대화형 프롬프트를 작성하는 것은 의미가 없습니다.기록하다. 그러나 원칙적으로는 이 서비스를 권한 없는 방식으로 실행해야 합니다. 그렇지 않다필요무엇을 하든 슈퍼유저 권한.

#!/bin/bash또 다른 경험 법칙은 꼭 필요한 경우가 아니면 스크립트를 사용하지 않는 것입니다.Bashism이 사용됩니다. 지난 수십 년 동안 Debian Linux 및 Ubuntu Linux에서 시스템 부팅/종료가 가장 크게 가속화된 것 중 하나는 /bin/shBourne Again 셸에서 Debian Almquist 셸로 전환한 것입니다. 이와 같은 간단한 스크립트를 작성하려면 POSIX 호환으로 만들고 다음을 사용하십시오.#!/bin/sh 그래도, Debian/Ubuntu를 사용하지 않더라도 Debian/Ubuntu에서는 Debian Almquist 쉘 혜택을 받을 수 있습니다.

또한 유사한 도구를 사용하여 더 많은 투명 TTY 메시지를 사용하기로 결정한 경우 프로그램이 terminfo 데이터베이스에서 내보낼 올바른 이스케이프 및 제어 시퀀스를 찾을 수 있도록 환경 변수를 dialog설정해야 합니다 . TERM다시 한번 증언해 보세요 debug-shell.service. (위 run프로그램에서는 비교를 위해 vc-get-ttytoolset TERM.)

마찬가지로, 당신은 원할 것입니다스크립트 오류기록됩니다. 따라서 표준 오류는 StandardError=journal. 다음은 이와 동등한 기능을 설명하고 실제로 필요하지 않은 프로그램을 제거할 수 있는 사용자 권한을 보여주는 nosh 서비스 run프로그램입니다. systemd .INI 파일에서는 다음과 같습니다 User=daemon.

%cat/etc/service-bundles/services/monitor-fsck-progress/service/run
#!/빈/노쉬
#fsck 진행 상황을 모니터링하기 위한 로컬 소켓
로컬 스트림 소켓 수신 --systemd-compatibility --backlog 2 --mode 0644 /run/fsck.progress
설정값
setlogin - 데몬 프로세스
vc-get-tty 콘솔
fdmove -c 4 2
오픈 컨트롤 tty
FD 모바일 2 4
setuidgid - 데몬 프로세스
. /제공하다
%

이 조건에서 실행되는 프로그램은 ./service오류가 로깅 서비스로 전송되는 동안 콘솔에 전체 화면 TUI를 렌더링합니다. 이는 일반적으로 서비스 및 기타 프로그램을 실행하고 콘솔과 통신하기 위해 서비스 관리자에서 수행해야 하는 작업입니다.

물론 이러한 전체 화면 TUI 프로그램은 systemd의 "A stop job is running"(콘솔에도 기록됨)과 충돌합니다. 그러나 이것이 당신의 문제입니다. ☺

추가 읽기

답변2

당신은 매우 가깝습니다. 사용하기 전에에코스크립트 초반에 다음을 사용하세요.초기화그 위에. 예:

# echo ^G
# reset
# echo ^G MESSAGE TO PUT ON THE TERMINAL

^G를 보내면 터미널 벨소리인 경고음이 울립니다.

관련 정보