내 스크립트를 etc/rc.local 파일에 추가하여 컴퓨터가 시작될 때 자동으로 시작되도록 하고 싶습니다. 내 스크립트에는 네트워크 조건이 필요하며 이 스크립트를 실행하면 네트워크가 아직 준비되지 않은 것으로 나타났습니다. 제 생각에는 rc.local이 늦게 시작될 수도 있는데 네트워크가 준비되어 있어야 할까요? 아니면 이 단계에서 네트워크를 사용할 수 없는 것이 정상적인 경우 내 스크립트를 어디에 배치해야 합니까? 어떤 의견이라도 환영합니다.
내 Linux 컴퓨터가 켜져 있습니다.Linux localhost.localdomain 4.18.0-147.8.1.el8_1.x86_64
rc.local의 코드 조각: ip address>>/home/user/log.boot 2>&1
log.boot는 다음과 같습니다.
eno1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
linker/ether xxxxxx brd ff:ff:ff:ff:ff:ff
답변1
내 기억이 맞다면 /etc/rc.local
더 이상 사용되지 않습니다. 시작 후 명령을 실행해야 하는 경우 @reboot
특수 플래그와 함께 cron을 사용하세요.
새 파일을 만들고 /etc/cron.d/
새 줄을 추가합니다.
@reboot ip address >> /home/user/log.boot 2>&1
cron은 다음 부팅 시 실행됩니다 ip address >> /home/user/log.boot 2>&1
.
답변2
실행 중인 systemd 서비스 /etc/rc.d/rc.local
(RHEL/CentOS/UEL 8에서 심볼릭 링크됨 /etc/rc.local
)의 기본 정의는 다음과 같습니다.
[Unit]
Description=/etc/rc.d/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
지정된 유일한 순서 종속성은 입니다 After=network.target
. 이는 별로 의미가 없습니다. 기본적으로 시작되면 NetworkManager.service
실행 됩니다 rsyslog.service
. 따라서 실제로는 NetworkManager가 네트워크 인터페이스를 시작하려고 시도하는 동안 일반적으로 병렬로 실행되는데, 이는 특정 목적에 비해 너무 이르습니다.
이는 자신만의 최소한의 시스템 서비스를 작성하는 좋은 예가 될 것입니다.
첫째, systemd ExecStart=
는 쉘 명령줄이 아닙니다. 리디렉션을 지원하지 않습니다. 따라서 예를 들어 명령에 대한 최소 쉘 스크립트를 작성 /usr/local/bin/log-boot-ip.sh
하고 실행 가능( )으로 표시하십시오 chmod +x /usr/local/bin/log-boot-ip.sh
.
#!/bin/sh
ip address >> /home/user/log.boot 2>&1
그런 다음 최소한의 내용을 작성해 보겠습니다 /etc/systemd/system/log-boot-ip.service
.
[Unit]
Description=log IP address(es) at each boot
ConditionFileIsExecutable=/usr/local/bin/log-boot-ip.sh
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/log-boot-ip.sh
[Install]
WantedBy=multi-user.target
언제나 그렇듯이 systemd
서비스 정의를 추가하거나 수정한 후 systemctl daemon-reload
해당 정의가 실행 log-boot-ip.service
되면 실행하세요.
Description
: 사람이 읽을 수 있는 짧은 설명ConditionFileIsExecutable
: 스크립트가 실행 가능하지 않으면 이 서비스는 무해하게 건너뜁니다.Wants
및After
: 네트워크 인터페이스가 활성화된 후 실행할 서비스를 설정하는 방법입니다man systemd.special
. 을 참조하세요.Type=oneshot
: 아무것도 실행되지 않고 스크립트가 종료되기 때문입니다. 이것이 없으면 systemd는Type=simple
스크립트 종료가 실패했음을 의미 한다고 가정합니다 .RemainAfterExit=true
: 시스템이 서비스가 한 번 실행되었음을 "기억"하고 스크립트가 종료된 경우에도 "활성"으로 표시합니다.ExecStart
:실행할 실제 명령/스크립트를 지정합니다.WantedBy=multi-user.target
: 서비스가 일반 시작 프로세스에 추가됩니다.