'ip address' 명령은 Linux의 rc.local에 IP 주소를 표시하지 않습니다.

'ip address' 명령은 Linux의 rc.local에 IP 주소를 표시하지 않습니다.

내 스크립트를 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: 스크립트가 실행 가능하지 않으면 이 서비스는 무해하게 건너뜁니다.

  • WantsAfter: 네트워크 인터페이스가 활성화된 후 실행할 서비스를 설정하는 방법입니다 man systemd.special. 을 참조하세요.

  • Type=oneshot: 아무것도 실행되지 않고 스크립트가 종료되기 때문입니다. 이것이 없으면 systemd는 Type=simple스크립트 종료가 실패했음을 의미 한다고 가정합니다 .

  • RemainAfterExit=true: 시스템이 서비스가 한 번 실행되었음을 "기억"하고 스크립트가 종료된 경우에도 "활성"으로 표시합니다.

  • ExecStart:실행할 실제 명령/스크립트를 지정합니다.

  • WantedBy=multi-user.target: 서비스가 일반 시작 프로세스에 추가됩니다.

관련 정보