며칠 동안 실행해야 하고 때로는 실패하는(오류와 함께 종료되는) 스크립트(작성하지 않았으며 수정할 수 없음)가 있습니다.
이 경우 내가 해야 할 일은재시작서버(현재 더 나은 솔루션은 없음) 및재시작스크립트. 현재 나는 이렇게 합니다:
SSH를 통해 로그인
screen -S job
./myscript.sh
작업을 시작합니다(이 스크립트에 다음만 포함되어 있고dothis
프로세스가 오류와 함께 종료될 수 있다고 가정).CTRL A, D화면에서 분리됨
...몇 시간만 기다려주세요...
로그인 후 복구 화면을 이용하세요
screen -r job
.아직 실행 중이라면 연결을 끊고 나중에 다시 돌아오세요.
스크립트가 실패하면sudo reboot
1단계부터 시작하여 시간이 오래 걸리는 작업을 계속할 수 있습니다.
사람의 개입 없이 어떻게 이를 수행할 수 있습니까?
스크립트에 오류가 있는 경우 이를 자동화하고 서버를 자동으로 다시 시작한 다음 스크립트를 다시 시작하도록 하려면 어떻게 해야 합니까?
답변1
먼저 스크립트를 컨테이너에 넣어 보겠습니다. 이렇게 하면 호스트 자체에서 일부 종속성이 제거되고 자동으로 다시 시작할 수 있습니다.
docker 및 docker-compose를 사용한 솔루션
이 방법에는 docker 및 docker compose가 필요합니다. Ubuntu가 있는 경우 sudo apt install docker.io docker-compose
.
- Dockerfile을 생성하여 컨테이너를 빌드합니다. 예를 들면 다음과 같습니다.
FROM ubuntu
COPY /path/to/script/on/host /myscript.sh
# maybe deal with some dependencies here
CMD /bin/bash /myscript.sh
위의 이름이 지정된 폴더를 Dockerfile
임의의 폴더에 저장하십시오. 다음에서 일부 문서를 볼 수 있습니다.https://docs.docker.com/engine/reference/builder/
- docker-compose.yml 생성
version: "3.9"
services:
scriptrunner:
build: .
restart: always
그것을 docker-compose.yml
넣다같은 디렉토리Dockerfile로. 여기에서 일부 문서를 참조하세요.https://docs.docker.com/compose/compose-file/compose-file-v3/
스크립트에서 일부 출력을 얻으려고 한다고 가정합니다. 이 경우 호스트와 컨테이너 간에 폴더를 "공유"하기 위해 도커 볼륨을 설정해야 할 수도 있습니다.
- 터미널의 폴더로 이동하여 를 입력합니다
docker-compose up -d
.
이 방법을 사용하면 스크립트를 컨테이너에 넣고 각 스크립트가 실패한 후 컨테이너를 다시 시작하면 데몬으로 실행됩니다.
systemd를 사용한 솔루션
컨테이너를 다루고 싶지 않다면 스크립트를 다른 컨테이너로 래핑할 수 있습니다 my-runner.sh
.
#!/bin/bash
/path/to/my-script.sh || systemctl reboot
스크립트가 실패한 후 컴퓨터가 다시 시작됩니다. 다시 시작하려면 다른 명령이나 루트 권한이 필요할 수 있습니다.
이제 실행 스크립트를 위한 시스템 서비스를 만들어 보겠습니다.이것훌륭한 튜토리얼이지만 다음 사항으로 요약됩니다.
systemd 단위 파일을 만들고 /etc/systemd/system/my-script.service
다음 내용을 입력합니다.
[Unit]
Description=my script runner service
After=network.target
Type=simple
User=my-user
ExecStart=/path/to/the/previous/my-runner.sh
[Install]
WantedBy=multi-user.target
이제 명령을 실행 systemcl start my-script && systemctl enable my-script
하여 시작하고 재부팅 후 시작되도록 할 수 있습니다.