Ubuntu 16.10에서 시작시 명령을 실행하는 방법 (rc.local 대안)


49

Ubuntu 16.10을 실행하는 Linode 서버에서 할당량을 설정하고 있는데 다음 오류가 발생합니다.

마운트 된 장치 / dev / root를 stat () 할 수 없습니다 : 해당 파일이나 디렉토리가 없습니다

이 문제를 해결하기 위해 수정을 위해이 스레드 에 도달했습니다.

ln -s /dev/xvda /dev/root
/etc/init.d/quota restart

/etc/rc.local. 그러나 Ubuntu 16.10은 rc.local더 이상 systemd 를 사용 하지 않습니다 . 에 대한 대안은 무엇입니까 rc.local, 시작시 위의 명령을 어떻게 실행할 수 있습니까?

또한 서비스를 사용하도록 설정 systemctl enable rc-local.service했지만 작동하지 않았습니다. 모든 리드를 부탁드립니다.


루트로 실행하고 시스템을 다시 시작 했습니까?
George Udosen

예 @George, 둘 다 한
Saurabh 샤르마


@George 그것은 잘 작동하지 않습니다
Saurabh Sharma

이 ... 날아 경우 그냥 볼이 해킹을 보았다
조지 Udosen

답변:


65

소개

George의 링크에서 제안한대로 새 서비스를 작성해서는 안된다고 생각합니다. 는 rc-local.service이미 systemd에 존재하고 서비스 파일은 제안 rc.local이 존재하고 실행 가능한 경우, 에 자동으로 뽑아됩니다multi-user.target . 따라서 방금 다른 방법으로 수행 한 작업을 다시 만들거나 강요 할 필요가 없습니다 systemd-rc-local-generator.

하나의 솔루션

빠른 해결 방법 (정식적인 방법인지 모르겠습니다) :

터미널에서 다음을 수행하십시오.

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
sudo reboot

그 후 rc.local시스템 시작시가 호출됩니다. 원하는 것을 삽입하십시오.

배경

터미널에서 할 경우 :

sudo systemctl edit --full rc-local

헤드 주석에 다음과 같은 줄이 포함되어 있음을 알 수 있습니다.

# This unit gets pulled automatically into multi-user.target by
# systemd-rc-local-generator if /etc/rc.local is executable.

이는이 시스템에서 /etc/rc.local실행 파일이라는 파일이 있으면 multi-user.target으로 자동으로 가져옵니다. 따라서 해당 파일 ( sudo touch...)을 만들고 실행 가능하게 만듭니다 ( sudo chmod +x ...).


4
사용하지 마십시오 #!/bin/bash하지만, 사용 #!/bin/sh하면 않는 한 정말 스크립트에서 떠들썩한 파티를해야합니다. 다른 모든 시스템 스크립트는 성능상의 이유로 bash가 아닌 대시를 사용합니다.
spikyjt

"systemd-rc-local-generator에 의해 다른 방식으로 수행 된 것을 재생성하거나 강요 할 필요 rc-local가 없다 " 는 다른 장치 후에 주문할 수 없습니까?
x-yuri

20

이 솔루션이 systemd 여기에 사용되는 것이 좋습니다 .

  1. 서비스를 작성하십시오.

    sudo vi /etc/systemd/system/rc-local.service
    
  2. 거기에 코드를 추가하십시오 :

    [Unit]
    Description=/etc/rc.local Compatibility
    ConditionPathExists=/etc/rc.local
    
    [Service]
    Type=forking
    ExecStart=/etc/rc.local start
    TimeoutSec=0
    StandardOutput=tty
    RemainAfterExit=yes
    SysVStartPriority=99
    
    [Install]
    WantedBy=multi-user.target
    
  3. /etc/rc.local실행 가능한지 확인 하고 그 안에이 코드를 추가하십시오 :

    sudo chmod +x /etc/rc.local

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    
    exit 0
    
  4. 서비스를 활성화하십시오 :

    sudo systemctl enable rc-local
    
  5. 서비스를 시작하고 상태를 확인하십시오.

    sudo systemctl start rc-local.service
    sudo systemctl status rc-local.service
    
  6. 모든 것이 잘 code되면 /etc/rc.local파일에 파일을 추가 하고 다시 시작할 수 있습니다.

참고 : Lubuntu 16.10에서 테스트되었습니다.

출처:

https://www.linuxbabe.com/linux-server/how-to-enable-etcrc-local-with-systemd


나는 모든 단계를 수행했습니다. : 나는 rc.local에와있다 touch "hello"전과를 exit 0. 서비스는 활성화 된 것처럼 보이지만 / etc / dir에 파일이 생성되지 않습니다. 우분투에서 실행 16.04 Arabian 5.31
Danny182

@Jan의 답변이 지적했듯이 systemd는 이미 rc.local을 지원하므로 완전히 새로운 서비스를 만들 필요가 없습니다.
TommyPeanuts

고맙습니다 uuuuuuuuuuuuuuuuuuuuuuuu, 이것은 효과가 있습니다
GPrathap

2

Jan의 대답에 추가하기 위해 일반적인 rc.local파일 과 달리 rc-local service모든 서비스가 시작된 후가 아니라 네트워크가 온라인 상태가 된 후에 실행됩니다.

경우에 따라 rc.local나중에 명령을 실행할 수도 있습니다 . 예를 들어 lxd시작 후 실행하기를 원했습니다 .

이 경우 컨텐츠와 함께 rc-local service드롭 인 conf 파일을 작성하여 시작 종속성을 편집 할 수 있습니다 /etc/systemd/system/rc-local.service.d/override.conf.

[Unit]
After=network.target lxd.service

필요한 단위 이름을 추가 할 수있는 위치 (추가 한 것처럼 lxd.service)

systemctl daemon-reload그 이후를 잊지 마십시오 .


Ask Ubuntu에 오신 것을 환영합니다! 다른 답변을 개선하려면 수정을 제안하십시오. 부분적인 대안을 제시하려면 동일한 부분 (원래 답변이 변경되는 경우)을 반복하거나 인용하여 차이점을 강조 표시하십시오. 어쨌든 새로운 불완전한 답변을 만들지 마십시오 ! 감사합니다.
David Foerster 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.