Linux에서 Init 명령을 사용하는 방법

Init 는 모든 프로세스의 부모입니다. 주된 역할은 / etc / inittab 파일에 저장된 스크립트로 프로세스를 만드는 것입니다 ( inittab (5) 참조). 이 파일에는 일반적으로 사용자가 로그인 할 수있는 각 행에 getty 를 생성하도록하는 항목이 있으며, 특정 시스템에서 필요로하는 자율 프로세스도 제어합니다.

런레벨

런레벨 은 선택한 프로세스 그룹 만 존재하도록 허용하는 시스템의 소프트웨어 구성입니다. 각 런레벨에 대해 init 에 의해 생성 된 프로세스는 / etc / inittab 파일에 정의됩니다. Init 는 8 개의 런레벨 중 하나가 될 수 있습니다 : 0-6S 또는 s . 런레벨은 특권을 가진 사용자가 telinit 을 실행하게함으로써 변경됩니다.이 명령은 적절한 신호를 init 에게 보내어 어떤 런레벨을 변경할 지 알려줍니다.

런레벨 0 , 16 은 예약되어 있습니다. 런레벨 0은 시스템을 정지시키는 데 사용되고, 런레벨 6은 시스템을 재부팅하는 데 사용되며, 런레벨 1은 시스템을 단일 사용자 모드로 다운시키는 데 사용됩니다. 런레벨 S 는 직접적으로 사용되는 것이 아니라 런레벨 1에 들어갈 때 실행되는 스크립트에 더 많이 사용됩니다. 자세한 내용은 shutdown (8) 및 inittab (5)의 맨 페이지를 참조하십시오.

런레벨 7-9도 유효하지만 실제로 문서화되지는 않습니다. 이것은 "전통적인"유닉스 변종이 그들을 사용하지 않기 때문이다. 궁금한 점이있을 때, 런레벨 SS 는 사실 동일합니다. 내부적으로 이들은 동일한 런레벨에 대한 별명입니다.

부팅

init 이 커널 부트 시퀀스의 마지막 단계로 호출 된 후 / etc / inittab 파일을 찾아서 initdefault 유형의 항목이 있는지 확인합니다 ( inittab (5) 참조). initdefault 항목은 시스템의 초기 런레벨을 결정합니다. 해당 항목이 없거나 ( / etc / inittab 을 전혀 사용하지 않는 경우) 시스템 콘솔에 런레벨을 입력해야합니다.

런레벨 S 또는 s 는 시스템을 단일 사용자 모드로 가져오고 / etc / inittab 파일을 필요로하지 않습니다. 단일 사용자 모드에서는 / dev / console 에 루트 셸이 열립니다.

단일 사용자 모드로 들어가면 init/etc/ioctl.save 에서 콘솔의 ioctl (2) 상태를 읽습니다 . 이 파일이 존재하지 않으면 init9600 baudCLOCAL 설정으로 행을 초기화합니다. init 이 단일 사용자 모드를 떠날 때 콘솔의 ioctl 설정을이 파일에 저장하여 다음 단일 사용자 세션에서 다시 사용할 수있게합니다.

처음으로 다중 사용자 모드로 들어가면, initbootbootwait 항목을 수행하여 사용자가 로그인하기 전에 파일 시스템을 마운트 할 수있게합니다. 그러면 런레벨과 일치하는 모든 항목이 처리됩니다.

새로운 프로세스를 시작할 때 init은 먼저 / etc / initscript 파일이 존재하는지 확인합니다. 이 경우,이 스크립트를 사용하여 프로세스를 시작합니다.

자식이 종료 할 때마다 init/ var / run / utmp/ var / log / wtmp 에 파일이 존재할 경우 사실과 이유를 기록합니다.

런레벨 변경하기

지정된 모든 프로세스를 생성 한 후, init 은 자손 프로세스 중 하나가 죽을 때까지 기다리고, powerfail 시그널을 받거나, telinit 에 의해 시스템의 런레벨을 변경할 때까지 기다린다. 위의 세 가지 조건 중 하나가 발생하면 / etc / inittab 파일을 다시 검사합니다. 언제든지 새 항목을이 파일에 추가 할 수 있습니다. 그러나 init 은 위의 세 조건 중 하나가 발생하기를 기다립니다. 즉각적인 응답을 제공하기 위해, telinit Q 또는 q 명령은 init 를 깨우고 / etc / inittab 파일을 다시 검사 할 수 있습니다.

init 이 단일 사용자 모드가 아니고 powerfail 신호 (SIGPWR)를 받으면 / etc / powerstatus 파일을 읽습니다. 그런 다음이 파일의 내용을 기반으로 명령을 시작합니다.

실패)

전원이 공급되지 않습니다. UPS가 전원을 공급하고 있습니다. powerwaitpowerfail 항목을 실행하십시오.

승인)

전원이 복원되면 powerokwait 항목을 실행하십시오.

낮은)

전원이 공급되지 않고 UPS의 배터리가 부족합니다. powerfailnow 항목을 실행하십시오.

/ etc / powerstatus가 없거나 F , O 또는 L 문자가있는 경우 init은 문자 F를 읽은 것처럼 작동합니다.

SIGPWR/ etc / powerstatus의 사용 은 권장하지 않습니다. init 과 상호 작용하기를 원하는 누군가는 / dev / initctl 제어 채널을 사용해야한다. 이에 대한 더 많은 문서는 sysvinit 패키지의 소스 코드를 보라.

init 이 런레벨을 변경하도록 요청되면, 새로운 런레벨에서 정의되지 않은 모든 프로세스에 경고 신호 SIGTERM 을 보냅니다. 그런 다음 SIGKILL 신호를 통해 이러한 프로세스를 강제 종료하기 전에 5 초 동안 대기합니다. init 은 이러한 모든 프로세스 (및 하위 프로세스)가 init이 원래 만든 프로세스 그룹에 남아 있다고 가정합니다. 프로세스가 프로세스 그룹을 변경하면 이러한 신호를 수신하지 않습니다. 이러한 프로세스는 별도로 종료해야합니다.

텔리 니트

/ sbin / telinit/ sbin / init에 링크됩니다. 1 문자의 인수를 취해 적절한 동작을 실행하기 위해서 (때문에) init 에 신호를 보낸다 . 다음은 telinit의 지시어입니다.

0 , 1 , 2 , 3 , 4 , 5 또는 6

지정된 실행 레벨로 전환하도록 init 에 지시하십시오.

a , b , c

런레벨 a , b 또는 c가 있는 / etc / inittab 파일 항목 만 처리하도록 init에 지시하십시오.

Q 또는 q

init 에게 / etc / inittab 파일을 다시 검사하도록 지시하십시오.

S 또는 s

단일 사용자 모드로 전환하도록 init에 지시하십시오.

U 또는 u

init 에게 스스로를 재실행 (상태를 보존)하도록 지시하십시오. / etc / inittab 파일을 다시 검사 할 필요가 없습니다. 실행 수준은 Ss12345 중 하나 여야합니다 . 그렇지 않으면 요청이 자동으로 무시됩니다.

telinitinit 에게 SIGTERM과 SIGKILL 신호를 보내는 프로세스를 기다려야하는 시간을 알려줄 수있다. 기본값은 5 초이지만 -t sec 옵션을 사용하여 변경할 수 있습니다.

telinit 은 적절한 권한을 가진 사용자 만 호출 할 수 있습니다.

init 바이너리는 프로세스 ID를 보고 init 또는 telinit 인지 확인합니다. 실제 init 의 프로세스 id는 항상 1 입니다. 이것으로 telinit 를 호출하는 대신 init 을 바로 가기로 사용할 수 있습니다.