종료 / 재부트 전에 명령 실행 [중복]


18

방랑 한 VM을 실행하는 머신이 있습니다. 내가 가진 문제는 때때로 컴퓨터를 종료하거나 재부팅하기 전에 해당 VM을 종료하는 것을 잊어 버린다는 것입니다. 이 때문에 내 컴퓨터는 다음 메시지와 함께 멈 춥니 다.waiting for vboxnet0 to become free

솔루션에 대해 검색 했으며이 페이지를 찾았습니다.

http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown

종료하려고 시도했지만 작동하지 않습니다.

해당 명령에 대해 sh 파일을 작성했습니다.

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

어떤 제안?


4
링크의 메소드는 유효하며 모든 Linux 버전에서 작동하므로 스크립트가 잘못되었습니다.;) 사용자는 root에 의해 수행되므로 종료시 알려지지 않았습니다. 따라서 "~"를 삭제하고 전체 경로로 만드십시오.
Rinzwind

작동합니까? 나는 gist.github.com/ymc-geha/8416723 과 같은 비슷한 마누엘을 따라 갔지만 우분투 14.04에서 나를 위해 작동하지
않았다

@ user2135804 나는 그것을 생각했다. 그러나 실제로 그것은 Vagrant를 위해 작동하지 않았다. 나는 다른 것들과 함께 시도하고 잘 작동했다.
SERPRO

1
그건 그렇고, 당신이 묘사하는 버그는 여기에 있습니다 .
Garrett

1
버그 보고서에서 볼 수 있듯이이 문제는 수정되었으며 VirtualBox 4.3.29에 포함됩니다.
개렛

답변:


11

가상 VM이 VirtualBox를 사용하는 경우 / etc / default / virtualbox를 수정하고 다음 줄을 변경할 수 있습니다.

SHUTDOWN_USERS=""

SHUTDOWN_USERS="all"

우분투 14.04에서 나를 위해 수정했습니다.


1
실제로 이와 연결된 가상 상자에 공개 티켓이 있습니다. virtualbox.org/ticket/12264 . 나는 것 사용 sugges SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`대신SHUTDOWN_USERS="all"
running.t

또한 VirtualBox를 사용하여 Vagrant와 함께 Ubuntu 14.04를 사용하고 있지만 /etc/default/virtualbox파일 이 없습니다 ...
Garrett

21

종료 또는 재부팅시 스크립트를 실행하려면

  1. /etc/rc6.d에 스크립트를 저장하십시오
  2. 실행 가능하게 만드십시오. sudo chmod +x K99_script

노트:

  • rc6.d의 스크립트는 확장자가 .sh가 아니어야합니다.
  • 적절한 시간에 스크립트를 실행하려면 K99로 시작해야합니다.
  • 이 디렉토리의 스크립트는 알파벳 순서로 실행됩니다.

출처


1
과연. 적시에 실행되도록 적절하게 이름을 지정하는 것이 매우 중요합니다.
shivams

1
스크립트를 /etc/rc6.d에 넣고 종료시 실행되지 않았습니다. /etc/rc0.d에 넣고 종료시 실행되었습니다. 아마도 rc.6은 재부팅 전용입니다.
Erel Segal-Halevi

2
@Erel Segal-Halevi 방금 /etc/rc6.d에 K99 스크립트를 추가하려고 시도했지만 실행되지 않았습니다. 다른 스크립트를 보면 ** bold K10reboot-> ../init.d/reboot ** code 줄이 있으므로 K99 스크립트가 실행되지 않는 것처럼 보입니다!
David Walker

아래 Ravi의 답변은 symlinks를 사용하여 종료 및 재부팅시 스크립트가 실행되도록하기 때문에 더 나은 선택입니다. 또한 대부분의 시스템 파일은 tis 접근 방식을 취하는 경향이 있다고 생각합니다.
Eddie

12

Systemd로 수행하는 방법 (더 쉬움)

우분투 변형과 민트가 시스템으로 옮겨 졌으므로 위의 기존 솔루션이 덜 만족 스럽습니다. 웹을 검색하여 systemd로 수행하는 방법을 찾고 다른 사람들의 지혜를 결합 하고 다음 자습서를 포함하는 blogspot.com.au 의 블로그 게시물로 문서화했습니다 .

systemd를 사용하면 아래 템플릿을 사용하여 스크립트를 호출하는 하나 또는 두 개의 파일을 만들고 몇 가지 명령을 실행합니다. 단순한.


GUI 버전

먼저 시작 및 / 또는 종료시 실행할 스크립트를 작성하십시오. 둘 다 필요하지 않은 경우 하나만 수행하십시오. .scopening_atstart 및 .scfullcopy_atend를 만들었습니다.

그런 다음 파일을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하고 권한에서 파일을 프로그램으로 실행 허용을 선택했는지 확인하여 파일이 실행 가능한지 확인하십시오.

여기에 이미지 설명을 입력하십시오

내가 만든 두 파일은 램 디스크의 내용을 채우고 저장합니다. 또한 서비스가 작동하고 있음을 증명하기 위해 내 홈 디렉토리에 파일을 만듭니다. 그것들은 형태였습니다 :

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

그런 다음 파일 관리자를 루트로 열고 /etc/systemd/system, startup.service 및 save-ramdisk.service 파일을 열어서 만들었습니다. 분명히 자신의 이름을 선택할 수 있으며 일반 이름에는 johns_start.service라는 시작 파일과 johns_shutdown.service라는 종료 파일이 포함될 수 있습니다. 기존 서비스 이름을 선택하지 마십시오.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

동일한 서비스 파일을 사용하여 내 실행 스크립트의 전체 경로를 대체 할 수 있습니다.

마지막 으로 각각에 대해 systemctl enable your_files_name 명령을 실행하십시오 (그러나 접미사 서비스는 사용하지 않음). 첫 번째는systemctl enable startup

서비스를 시작하려면 컴퓨터를 한 번 재부팅하십시오. 시작 서비스는 systemd가 다중 사용자 대상에 진입 할 때마다 실행되고 다중 사용자 대상이 종료 될 때 중지 서비스가 실행됩니다. 활성화 조건이 다른 대체 서비스 파일에 대해서는 아래에서 설명합니다.

유용한 추가 명령은 다음과 같습니다.

systemctl is-enabled startup
systemctl is-active startup
systemctl 다시 시작 시작

자세한 내용은 위의 참조에서 찾을 수 있습니다.



CLI (명령 줄) 버전

이 설명에서는 / home / john이 아닌 홈 디렉토리에서 작업하고 필요에 따라 sudo를 사용하고 vim 또는 svim을 작성하는 편집기를 선택한다고 가정합니다.

첫 번째 라인으로 시작 및 종료 쉘 스크립트를 작성#!/bin/sh 하고를 사용하여 실행 가능하게하십시오 chmod +x my_new_filename.

작성 위와 같이 두 개의 파일을, 또는이 예에서는 하나 개의 파일 핸들 시작 및 종료 작업에. 필자는 홈 디렉토리에서 스크립트를 실행하지만 @don_crissti는 Stack Exchange 에서 몇 가지 대안을 보여줍니다 .

svim /etc/systemd/system/start_and_stop.service

파일 내용을 복사하십시오.

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

그런 다음 다음 명령으로 서비스활성화하십시오 .

systemctl enable start_and_stop

서비스가 활성화 된 후 시스템을 재부팅하십시오. 명령 systemctl is-enabled start_and_stopsystemctl is-active start_and_stop사용하여 새 서비스를 모니터링 할 수 있습니다.



종료 트리거 조건 변경

위의 파일은 모두 다중 사용자 환경의 열기 또는 닫기를 사용하여 스크립트 실행을 시작합니다. 아래 파일은 네 가지 잠재적 종료 프로세스의 시작을 사용하여 스크립트를 시작합니다. Before 라인 + WantedBy 라인에서 대상을 추가 또는 제거하면보다 세부적으로 구별 할 수 있습니다.

이 파일은 이 게시물 의 두 번째 답변에서 제안 되었지만 설치 섹션을 추가 할 때까지 실행할 수 없었습니다.

다시 스크립트를 편집하고을 /etc/systemd/service/사용하여 활성화하십시오 systemctl enable your_file_name. 대상을 변경하면 systemclt disable file_name명령을 사용한 다음 대상 디렉토리에 심볼릭 링크 된 명령을 다시 활성화했습니다. 재부팅하면 서비스가 작동합니다.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

7
더 쉬워? 무엇보다 쉬운가요? 에베레스트를 등반하는 것보다 쉬운가? 여기에 게시 된 다른 모든 솔루션은이 솔루션보다 쉽습니다.
Fran Marzoa

와우, 그것은 완전하고 괜찮은 답변이며 모든 사람들이해야 할 일입니다-/etc/rc6.d의 이름 지정 문제와 혼란은 그 답이 좋지 않다는 것을 나타냅니다. 절차가 단순하다면, 반드시 안전하게 목표를 달성 할 힘이있는 것은 아닙니다. [설치] 섹션을 참조하십시오-스크립트가 정확한 시간에 실행될 것입니다. 또한 답이 길기 때문에 그 답이 복잡하다는 의미는 아닙니다! 감사합니다 BTW, John9631,이 대답은 ... 완벽과 시간에 미션 크리티컬 한 시점에서 안전하고 효율적인 스크립트를 만드는 헤아릴 수 없을 것이다
밀러 고릴라

11
  1. /etc/init.d/ 디렉토리에 스크립트로 쉘 실행 파일을 작성하십시오.

  2. 이것은 종료 또는 재부팅 중에 실행되어야하므로 /etc/rc0.d/ 및 /etc/rc6.d에 소프트 링크를 만들어야합니다.

예:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/init.d/<your_file>

chmod링크 대상의 권한 플래그를 변경합니다. 두 인수 모두 동일합니다. 둘 다 지정하면 중복됩니다.
David Foerster

2

당신은 여기에서 해결책을 찾을 수 있습니다 일시 중단 / 시스템 종료 / 시작시 모든 방랑 박스를 다시 시작 .

종료하기 전에 실행중인 모든 상자를 일시 중단하는 간단한 init 스크립트가 있습니다.

설치

/etc/init.d/vagrant-boxes위 기사에서 스크립트를 편집 하여 붙여넣고 저장하십시오. 또는 여기에서 다운로드하여에 저장하십시오 /etc/init.d/vagrant-boxes. 데비안 / 우분투 등에서 다음을 실행하십시오.

# update-rc.d vagrant-boxes defaults 99 01

숫자 99는 시퀀스 번호이며, (제 경우에는 데비안 배포판의 기본값 인 Virtualbox 번호 20)보다 커야합니다. 두 번째 숫자는 컴퓨터를 종료 할 때의 순서입니다. 따라서 우선하는 것이 좋습니다.


2

우분투 14.10의 RC04경우RC99

처음부터해야 할 일

  1. 에 스크립트 작성 /etc/init.d/scriptName
  2. 통해 연결 ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

내가 겪은 단계

  1. Ubuntu를 성공적으로 사용하지 못했습니다 -시작 및 종료시 스크립트 실행
  2. rc0.d (rc6.d, rc.d)가있는 Ubuntu 14.10 종료 스크립트를 찾았습니다.
  3. /etc/rc6.d/RC99linkName에서 /etc/rc6.d/RC04linkName으로 변경했으며 작동합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.