무정전 프로그램을 중단하는 방법은 무엇입니까?

무정전 프로그램을 중단하는 방법은 무엇입니까?

mysqld명령줄에서 실행 하면 일부 시작 메시지가 표시되고 응답이 중지됩니다. 출력을 생성하지 않고 입력을 무시하므로 이를 제거할 방법이 없는 것 같습니다. ctrl+z 및 ctrl+c는 아무 작업도 수행하지 않으며 터미널로 돌아갈 수 없습니다. 새 세션을 시작해야 합니다. 예를 들어 SSH를 통해 서버에 연결하는 경우 새 SSH 연결을 시작해야 함을 의미합니다.

이것은 매우 성가신 일입니다. bash에서 현재 실행 중인 프로세스를 비활성화하도록 지시하는 방법이 있나요? ctrl+z를 사용하면 다른 프로그램을 일시 중지할 수 있지만 mysqld는 일시 중지할 수 없습니다. 이유는 모르겠습니다. 시작하면 mysqld &백그라운드에서 실행되며 fg잘못 입력하지 않는 한 정상적으로 신호를 보낼 수 있습니다. 그렇지 않으면 일반 프로세스처럼 작동하므로 ctrl +z가 효과가 없는 이유를 모르겠습니다. 왜냐하면 나는 이것이 bash의 일부이지 프로세스의 통제를 받지 않는다고 생각하기 때문입니다.

그렇다면 Ctrl+Z가 작동하지 않을 때 Ctrl+Z를 대신할 수 있는 방법이 있나요?

답변1

이 명령은 stty -a현재 터미널의 모든 키보드 단축키를 표시합니다. 일반적으로 Unix 계열 시스템에서 매핑되는 신호는 Ctrl+ C(SIGINT), Ctrl+ \(SIGQUIT) 및 Ctrl+ Z(SIGTSTP)뿐입니다. 다른 신호에 대한 다른 바인딩은 없으므로 현재 세션에서 키보드를 사용하여 다른 신호를 보낼 수 없습니다.

일반적으로 d프로그램 이름의 마지막 숫자는대개"데몬 프로세스"를 나타냅니다. 데몬은 백그라운드에서 실행되고 표준 입력/출력(파이프, 신호, 소켓 등) 이외의 수단을 통해 작동하도록 설계되었습니다. 이것은 그것을 의미한다가능한프로그램 자체가 백그라운드에서 실행되고 있지 않을 때 예기치 않은 동작이 발생할 수 있습니다(예: 데몬이 입력, 출력으로 작업을 수행하거나 루프/대기 중에 작업을 수행하기 때문에 터미널이 "멈춘" 것처럼 보입니다)

종종 데몬은 특정 신호에 대한 트랩을 갖고 이를 다르게 처리하거나 무시할 수도 있습니다. 테스트 목적으로 백그라운드에서 실행되는 동안 SIGINT( + kill -2와 동일 ), SIGQUIT( + 와 동일 ) 또는 SIGTSTP( + 와 동일 ) 를 보내 보셨습니까 ?CtrlCkill -3Ctrl\kill -20CtrlZmysqld

편집: 매핑을 변경하려면 stty다음을 작성해야 합니다.

stty <action> <new-mapping>

예를 들어 SIGINT를 Ctrl+ 로 다시 매핑합니다.X

stty intr ^x

이 설정은 현재 세션 동안 현재 터미널에만 적용됩니다.

답변2

Ctrl+는 Z실제로 bash가 아닌 커널의 범용 터미널 인터페이스 기능입니다. 이는 SIGTSTP 신호가 포그라운드 프로세스로 전송되도록 합니다. 마찬가지로 Ctrl+는 CSIGTERM을 보내고 Ctrl+는 \SIGQUIT를 보냅니다.

Ctrl프로그램이 + Z의 효과를 잃게 만드는 두 가지 방법이 있습니다 .

  • 프로그램은 SIGTSTP 신호를 무시할 수 있습니다.
    디버거를 사용하여 프로세스의 신호 동작을 검사할 수 있습니다. Linux에서는 다음을 통해 이 정보를 얻을 수 있습니다./proc: grep Sig /proc/1234/status여기서 1234는 프로세스 ID로, 어떤 신호가 무시되는지( SigIgn, 무해하게 바운스됨) 또는 차단되는지( SigBlk, 프로그램이 입력을 허용할 때까지 대기 상태에 놓임)를 나타냅니다. 숫자는 비트마스크이며 16진수로 기록됩니다. SIGTSTP는 신호 20( kill -lbash에서 실행 중)이므로 SigIgn줄 오른쪽의 다섯 번째 숫자가 8 이상이면 신호가 무시됩니다.
  • 프로그램은 키 바인딩을 변경할 수 있습니다.
    명령줄을 사용하여 현재 키 바인딩을 확인할 수 있습니다. 예를 들어 stty -a </dev/pts/42프로세스가 실행 중인 터미널은 어디입니까? /dev/pts/42찾다 susp = ^Z.

데몬은 대부분의 신호를 무시할 수 있습니다. 자체적으로 분기되지 않으면 백그라운드에서 시작합니다(대부분의 데몬은 실제로 시작 직후 하위 프로세스를 분기하고 상위 프로세스도 즉시 분기합니다). 포그라운드에서 시작한 경우 복구할 수 있는 방법이 있지만(해당 쉘이나 상위 쉘에 신호 보내기) 다른 쉘이 필요합니다.

관련 정보