나는 새로운 Debian 안정 시스템을 설치하고 구성하는 데 사용하는 일련의 스크립트를 가지고 있습니다. 내가 사용하는 프로그램을 자동으로 시작하려면 /etc/rc.local
다른 경우에는 파일을 수동으로 변경해야 합니다 /etc/inittab
. --noclear
행에 추가하는 것과 같은 다른 변경 사항이 있습니다 1:2345:respawn:/sbin/getty --noclear 38400 tty1
.
종료 프로세스를 사용자 정의해야 했기 때문에 결국 다음과 같이 했습니다.
l0:0:wait:/etc/rc.halt 0
...
l6:6:wait:/etc/rc.halt 6
이게 내 /etc/rc.halt
모습이야
#!/bin/sh
#
# rc.halt
#
# This script is executed when entering level 6/0 (on halt or reboot)
su - teststand -c "/home/teststand/stop_server.sh" # my custom command
# making sure the halt/reboot process is resumed
test -n "${1}" && /etc/init.d/rc ${1}
exit 0
오늘은 처음으로 systemd
기본 초기화 시스템으로 새로운 Debian 8을 설치하는 날이었습니다. 이런 건 생각지도 못했는데 /etc/inittab
파일 손실이 있어서 처음에 놀랐어요.
현재 시스템(@work 및 @home)에서는 여전히 시스템을 실행하고 있기 sysvinit
때문에 systemd
.
이전 버전으로 변경할 수 있다는 것을 알고 있지만 sysvinit
에서 작동하는 것이 무엇인지 확인하고 싶습니다 systemd
. 또한 지금 새 설치를 사용자 정의하고 있는데 완료할 시간이 많지 않기 때문에 설치를 완료하지 않습니다. 지금은 문서를 볼 시간이 없습니다.
systemd
내 질문: 동작을 빠르게 변경하여 추가 --noclear
하고 다시 시작/중지의 시작점 getty
으로 사용할 수 있는 방법이 있습니까 ?/etc/rc.halt
기본적으로 이전 inittab
변경 사항을 빠르게 가져올 수 있나요 systemd
?
감사해요
답변1
systemd는 System 5와 역호환되지 않으며 init
System 5만 호환됩니다 rc
.
Linux System 5 스타일 시스템 관리는 두 부분으로 구성됩니다. init
이는 프로세스 #1로 실행되며 rc
시작 및 중지 스크립트 실행을 담당합니다. 실제로는 데비안의 두 가지 다른 패키지에서 왔습니다. init
출신이다시스템 베넷패키지; rc
일반적으로 다음에서 제공됩니다.sysv-rc패키지이지만 다음에서 올 수도 있습니다.파일-rc또는오픈소스 라이브러리팩.
/etc/inittab
처리된 구성 파일입니다 init
. systemd는 이에 대한 이전 버전과의 호환성 메커니즘을 제공하지 않습니다. systemd의 System 5 이전 버전과의 호환성 메커니즘은 rc
가 실행되는 System 5에만 적용됩니다 /etc/init.d/
. (이는 systemd의 특정 버전에만 적용되며 rc
systemd는 file-rc 및 openrc의 구성 메커니즘에 대한 이전 버전과의 호환성 메커니즘을 구현하지 않습니다.)
이것은 systemd에만 국한된 것이 아닙니다. 거의아니요init/sysmanager 프로세스를 교체합니다(30년에 한 번 제외) /etc/inittab
.
서비스를 systemd에 연결하려면 서비스가 사용하는 메커니즘을 사용해야 합니다.하다지원, 즉 자신의서비스 단위파일 및 (자동으로 유닛 파일로 변환하는 생성기를 통해) .format rc
시스템 5 구성 파일 /etc/init.d/
.
런레벨은 잊어버리세요.
사용 중인 모든 런레벨 항목은 시스템 Linux 운영 체제에서 "사용되지 않음"으로 선언되었습니다. 아니요런레벨 0 또는 6을 입력할 수 있습니다. 일부 호환성 스페이서가 없으면 존재하지 않습니다.
서비스가 종료되었을 때 서비스를 실행하려면 서비스 단위를 만드는 것이 많은 사람들의 당연한 대답입니다 WantedBy
. shutdown.target
그러나 여기에는 몇 가지 미묘한 함정이 있습니다. 더 낫지만 덜 명확한 대답은 일반 서비스 단위를 만들어 DefaultDependencies=yes
종료 대상과 충돌하는지 확인하고 서비스의 핵심 콘텐츠 ExecStop
를 ExecStart
.
[단위] 문서=https://unix.stackexchange.com/questions/233561/ [제공하다] 종류=일회용 사용자=테스트벤치 종료 후 남은 값=true ExecStart=/bin/true ExecStop=/home/teststand/stop_server.sh [설치하다] WantedBy=다중 사용자.대상
쉘 스크립트에서 가난한 사람의 데몬 관리자를 직접 만들지 마십시오.
이런 글은 항상 제대로 작성되지 않습니다.
"서비스"가 단순히 "stop_server.sh"라는 명령을 실행하는 경우 이는 일부 수동 셸 스크립트 서비스 관리 시스템에서 서버를 중지하는 스크립트임을 추론할 수 있습니다.
제대로 작성되지 않고, 불안정하고, 신뢰할 수 없고, 위험한 재난에 대해서만:stop_server.sh
stop_server.sh
stop_server.sh
stop_server.sh
stop_server.sh
stop_server.sh
당신은 체계화했습니다. 이를 활용하고 여기에서 실행되는 모든 서비스에 대해 적절한 서비스 관리 메커니즘을 사용하십시오. ExecStop
원한다면 이 이상한 서비스는 전혀 필요하지 않습니다실제DefaultDependencies=true
서비스는 다음과 같이 systemd를 통해 실행될 수 있습니다 .systemd가 서비스 종료를 처리합니다종료 시간 동안.
하나의 서비스를 "관리"하기 위해 쉘 스크립트에 가난한 사람의 데몬 감독자를 고용한 다음 이를 시스템 서비스 단위로 래핑하여 두 번째 서비스를 제공하고 종료 시 해당 서비스를 시작하도록 준비하는 것은 단지첫 번째 서비스 관리그리고 시스템이 중지되거나 종료될 때 시스템을 종료하는 것은 시스템화된 공포의 집에 들어가는 좋은 방법입니다.
세상은 당신이 화면을 청소하기를 원합니다.
~ 고 싶어요아니요Greg Wooledge와 다른 사람들이 발견했듯이 로그아웃과 후속 로그인 사이에 가상 터미널을 지우는 것은 실제로 추세에 어긋나는 것입니다. 권한 있는 사용자나 상사가 로그아웃한 후에도 지속되는 민감한 출력은 1970년대부터 Unices(및 실제로 다른 시분할 원격 액세스 운영 체제)의 보안 문제였으며 이러한 모든 출력을 취소하려면 상당한 노력이 필요합니다. 이 문제를 피하기 위해 사람들이 넣은 것들.
- 많은 시스템에는
clear_console
쉘 로그아웃 스크립트에 표준 명령이 있습니다. (커널 가상 터미널 #1에서 실행되는 그래픽 프로그램에서는 잘 작동하지 않고, 다른 종류의 터미널(가상 또는 실제)에서는 작동하지 않기 때문에 이 자체가 문제가 됩니다.)이 명령은 제거되어야 합니다.
- 예를 들어 가상 터미널을 대상으로 하는 getty 프로그램의 기본 설정은
mingetty
터미널을 지우는 것입니다. (로그인하기 전에 이 작업을 수행합니다. 즉, TTY 로그인 서비스가 중지되면 터미널 출력이 변경되지 않을 수 있습니다. 아이러니하게도 이 기능은login
PAM의 필요성 덕분에 더 나은 위치에 배치될 수 있었지만 로그아웃해도 여전히 실행 중입니다. ).--noclear
이 기능을 비활성화하려면 이 옵션을 배포해야 합니다. 여기에는 파일을 덮어쓰거나, 설정을 변경하거나ExecStart
, 단순히[email protected]
자신이 디자인한 로컬 유닛 파일을 가리키는 하나 이상의 유닛 파일을 작성하는 작업이 포함됩니다. - systemd에서 제공하는
[email protected]
템플릿 서비스 단위 세트는TTYVTDisallocate=yes
systemd에 커널 가상 터미널을 지우도록 지시합니다. (이것은 이름이 부분적으로 반영되므로 사용자 공간 가상 터미널을 포함한 다른 종류의 터미널에서는 작동하지 않습니다.)또한 재정의되거나 지정된 다른 서비스 템플릿을 사용하여 다시 제거해야 합니다
[email protected]
.
추가 읽기
- 조나단 데보인 폴라드(2015).
/etc/inittab
그것은 과거의 일입니다.. 일반적인 답변. - https://unix.stackexchange.com/a/196014/5132
- 종료하기 전에 systemd를 사용하여 스크립트를 실행하는 방법은 무엇입니까?
- 조나단 데보인 폴라드(2014).
su
사용자 삭제 권한을 남용하지 마십시오 .. 일반적인 답변. - 그렉 울리지(2014-04-08). 내 빌어먹을 콘솔 청소는 그만둬.. 그렉의 위키.
- 조나단 드 보인 폴라드(2015-08-22).Debian Jessie의 여러 tty로 인해 시스템이 정지됩니다.. [이메일 보호됨]. 데비안 사용자입니다.
- https://unix.stackexchange.com/a/194218/5132
- 조나단 데보인 폴라드(2015). 시스템화 된 공포의 집. 일반적인 답변.
답변2
저는 CentOS 7을 사용하고 있는데 설정이 다를 수 있습니다. 그러나 나에게 있어 통화는 getty
서비스 파일에 의해 제어됩니다. (템플릿용입니다. 파일에 전달되는 문자열로 시작하고 실행되는 TTY를 제어합니다.) 이 파일에는 명령줄을 지정하는 로 시작하는 줄이 있습니다. 여기에 옵션이 추가됩니다. (아래 파일은 시스템 업그레이드로 인해 덮어쓸 수 있으므로 직접 편집하지 않는 것이 가장 좋으며, 먼저 아래 위치에 복사해야 하며, 이로 인해 업체 제공 파일이 숨겨질 수 있습니다.)/usr/lib/systemd/system/[email protected]
@
[email protected]
tty1
ExecStart=
/usr
/etc
/etc/systemd/system
systemd
종료/다시 시작을 원하는 가장 좋은 방법은 종료/다시 시작 프로세스를 직접 조정하는 것이 아니라 시스템이 중지되거나 다시 시작될 때 자동으로 수행되는 서비스 종료 작업 목록에 해당 작업을 추가하는 것입니다. )을 사용하여 서비스를 수동으로 종료하는 경우 systemctl
. 이를 수행하는 빠른 방법은 스크립트를 한 줄의 ExecStop
시스템 서비스 명령으로 바꾸는 것입니다. 설정 방법에 따라 전체를 관리하는 사용자 서비스 파일을 만들어 ExecStop
거기에 넣을 수도 있습니다.