Linux 서비스를 충돌 또는 재시작 후 자동으로 시작하도록 구성하는 방법 - 섹션 2: 참조

Linux 서비스를 충돌 또는 재시작 후 자동으로 시작하도록 구성하는 방법 - 섹션 2: 참조

2022-06-01 last update

12 minutes reading CentOS System Tools Debian Ubuntu Linux Commands Linux Basics
저자는 Free and Open Source Fund 계획의 일부로 기부를 받기로 했다.

소개


이 강좌에서는 MySQL을 재부팅 또는 충돌 후 자동으로 재부팅하도록 systemd 를 사용합니다.
이것은 두 부분으로 구성된 시리즈의 두 번째 부분이다.Write for DOnations는 일반적인 Linux 서비스 관리 개념, 예를 들어 init 수호 프로그램과 운행 단계를 소개했다.마지막으로 systemd 에서 서비스 관리를 보여 주었다.여기에서 targets, wants, requiresunit 파일을 검사합니다.이 부분(두 번째 부분)은 사용Part One의 실제 예시를 제공했다.
참고: 읽기도 고려할 수 있습니다MySQL database.

선결 조건


이 강좌를 완성하려면 다음이 필요합니다.

  • CentOS 8을 실행하는 서버는 sudo 권한이 있는 비root 사용자를 포함합니다.이 모든 것을 방화벽을 포함하여 설정하려면 our very popular tutorial on using systemctl to control systemd services and units 을 한 다음 우리의 create a DigitalOcean Droplet running CentOS 8 에 따라 조작할 수 있습니다.

  • ySQL이 설치되었습니다.자세한 내용은 저희 강좌Initial Server Setup Guide를 참조하십시오.
  • systemd를 사용하여 MySQL을 시작 후 자동으로 시작하도록 구성


    ySQL을 설치한 후 서비스 상태를 확인합니다.
    1. sudo systemctl status mysqld.service
    서비스가 실행 중이지만 데몬이 비활성화되었음을 출력해야 합니다.
    Output
    mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2020-12-24 23:48:56 UTC; 1h 6min ago Process: 30423 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 30294 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS) Process: 30270 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 30378 (mysqld) Status: "Server is operational" Tasks: 40 (limit: 4763) ...
    서비스가 활성화되어 있으면 비활성화합니다.변경하기 전에 우리는 먼저 장애인의 행동을 탐색하기를 바란다.
    1. sudo systemctl disable mysqld.service
    다음 명령을 실행하여 다중 사용자가 MySQL을 필요로 하는지 확인합니다.대상:
    1. sudo systemctl show --property "Wants" multi-user.target | fmt -10 | grep mysql
    아무것도 돌아오지 않을 거야.이제 기호 링크가 있는지 확인합니다.
    1. sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*
    기호 링크 파일이 존재하지 않는다는 메시지가 나타납니다.
    Output
    ls: cannot access '/etc/systemd/system/multi-user.target.wants/mysql*': No such file or directory
    이제 원하는 경우 서버를 다시 시작하고 MySQL 서비스를 확인하십시오.그것은 운행해서는 안 된다.
    재부팅 여부와 관계없이 이제 MySQL 서비스를 다시 설정합니다.
    1. sudo systemctl enable mysqld.service
    이번에는 /etc/systemd/system/multi-user.target.wants/ 에 기호 링크가 생성됩니다.
    Output
    Created symlink /etc/systemd/system/multi-user.target.wants/mysqld.service → /usr/lib/systemd/system/mysqld.service.
    이것을 확인하려면 ls 명령을 다시 실행하십시오.
    1. sudo ls -l /etc/systemd/system/multi-user.target.wants/mysql*
    다음 출력을 받게 됩니다.
    Output
    lrwxrwxrwx 1 root root 38 Aug 1 04:43 /etc/systemd/system/multi-user.target.wants/mysqld.service -> /usr/lib/systemd/system/mysqld.service
    시스템d 서비스를 사용하거나 사용하지 않으면 기본 대상의 wants 디렉터리에서 기호 링크를 만들거나 삭제합니다.
    원한다면 물방울을 다시 시작하십시오. 물방울이 온라인으로 돌아왔을 때 ps -ef 명령을 실행하여 서비스 상태를 검사하십시오.
    1. ps -ef | grep mysql
    MySQL이 실행 중인 경우 이 명령은 MySQL에 대한 정보를 제공합니다.
    [secondary_label Output]\
    mysql        851       1  2 04:26 ?        00:00:02 /usr/libexec/mysqld --basedir=/usr
    
    이제 MySQL을 재부팅 후 재부팅하도록 구성했습니다.다음은 붕괴를 설명할 것입니다.

    시스템 d를 사용하여 MySQL을 충돌 후 자동으로 시작하도록 구성


    현대 응용 프로그램으로서 MySQL은 충돌 후 자동으로 시작되도록 설정되었습니다.어떻게 그것을 사용하지 않는지 봅시다.
    편집기에서 MySQL 서비스 셀 파일을 엽니다.
    1. sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service
    제목 정보 이후 파일의 내용은 다음과 같습니다.
    /etc/systemd/system/multi-user.목표/mysqld를 원합니다.서비스
    
    [Unit]
    
    Description=MySQL 8.0 database server
    After=syslog.target
    After=network.target
    
    [Service]
    
    Type=notify
    User=mysql
    Group=mysql
    
    ExecStartPre=/usr/libexec/mysql-check-socke
    ExecStartPre=/usr/libexec/mysql-prepare-db-dir %n
    `# Note: we set --basedir to prevent probes that might trigger SELinux alarms,`
    `# per bug #547485`
    ExecStart=/usr/libexec/mysqld --basedir=/usr
    ExecStartPost=/usr/libexec/mysql-check-upgrade
    ExecStopPost=/usr/libexec/mysql-wait-stop
    
    `# Give a reasonable amount of time for the server to start up/shut down`
    
    TimeoutSec=300
    
    `# Place temp files in a secure directory, not /tmp`
    
    PrivateTmp=true
    
    Restart=on-failure
    
    RestartPreventExitStatus=1
    
    `# Sets open_files_limit`
    
    LimitNOFILE = 10000
    
    `# Set enviroment variable MYSQLD_PARENT_PID. This is required for SQL restart command.`
    
    Environment=MYSQLD_PARENT_PID=1
    
    [Install]
    
    WantedBy=multi-user.target
    
    보시다시피 Restart 매개변수의 값은 on failure로 설정됩니다.이것은 MySQL 서비스가 종료 코드가 불결하거나 시간이 초과되어 다시 시작된다는 것을 의미한다.
    How To Install MySQL on CentOS 8 재부팅 매개변수의 다음 테이블이 표시됩니다.
    재부팅 설정/종료 원인
    아니오
    언제나
    성공 정보
    장애 발생 시
    이상시
    중단시
    모니터에서
    출구 코드나 신호 지우기
    10.
    10.
    불결한 종료 코드
    10.
    10.
    신호가 불결하다
    10.
    10.
    10.
    10.
    시간을 초과하다
    10.
    10.
    10.
    감찰인
    10.
    10.
    10.
    10.
    시스템d 서비스 단원 파일에서 두 개의 매개 변수RestartRestartSec가 붕괴 행위를 제어합니다.첫 번째 매개 변수 지정 서비스는 언제 다시 시작해야 하는지, 두 번째 매개 변수 정의는 다시 시작하기 전에 얼마나 기다려야 하는지를 지정합니다.
    충돌 동작을 테스트하려면 kill-9 신호를 사용하여 MySQL 프로세스를 중지합니다.우리의 예에서 주 PID는 851이다.PID를 자신의 것으로 교체하려면 다음과 같이 하십시오.
    ps-ef | grep mysql
    1. sudo kill -9 851
    몇 초 동안 기다린 다음 상태를 확인하십시오.
    1. sudo systemctl status mysqld.service
    출력은 MySQL이 새 PID를 사용하여 재부팅되었음을 나타냅니다(이 경우 새 프로세스 ID는 1513).
    Output
    mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2020-12-25 04:47:48 UTC; 55s ago Process: 1420 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS) Process: 1559 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 1476 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)Process: 1451 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 1513 (mysqld) Status: "Server is operational" ...
    그런 다음 셀 파일을 다시 엽니다.
    1. sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service
    ySQL 데몬 셀 파일에서 Restart 명령을 메모하고 저장합니다.그러면 재부팅 비헤이비어가 비활성화됩니다.
    /etc/systemd/system/multi-user.목표/mysqld를 원합니다.서비스
    
    `# Restart=on-failure`
    
    그 다음에 systemd 데몬을 다시 불러오고 mysqld 서비스를 다시 시작합니다.
    1. sudo systemctl daemon-reload
    2. sudo systemctl restart mysqld.service
    다음 명령을 실행하면 서비스의 기본 PID를 찾을 수 있습니다.
    1. sudo systemctl status mysqld.service
    Output
    . . . Main PID: 1895 (mysqld)
    kill -9 명령을 사용하여 사용자 환경에서 MySQL PID의 주 PID를 죽입니다(테스트 환경에서 PID를 사용합니다).
    sudo kill -9 1895
    
    ySQL 상태 확인:
    1. sudo systemctl status mysqld.service
    서비스가 실패했음을 표시합니다.
    Output
    mysqld.service - MySQL 8.0 database server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: **failed** (Result: signal) since Fri 2020-12-25 05:07:22 UTC; 1min 14s ago Process: 1976 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS) Process: 1940 ExecStartPost=/usr/libexec/mysql-check-upgrade (code=exited, status=0/SUCCESS) Process: 1895 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=killed, signal=KILL) Process: 1858 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS Process: 1833 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS) Main PID: 1895 (code=**killed**, signal=KILL) ...
    서비스 상태를 몇 번 찾아보십시오.각 서비스는 failed 로 표시됩니다.
    따라서, 우리는 붕괴를 모의하였는데, 그 중 서비스는 이미 정지되었지만, 아직 회복되지 않았다.시스템이 불결하게 정지된 후에 서비스를 다시 시작하지 말라고 지시했기 때문이다.mysqld를 편집하면서비스 단원 파일, 리셋 매개 변수에 대한 설명을 취소하고, 저장하고, 시스템 ctl 수호 프로그램을 다시 불러오고, 마지막으로 서비스를 리셋합니다. 이것은 정상적인 기능을 회복합니다.
    이것은 어떻게 본 컴퓨터 시스템 d 서비스를 충돌 후 자동으로 시작하도록 설정합니까?서비스 단위 파일의 Restart 부분에서 RestartSec (선택 사항[Service] 에 추가 명령을 추가하기만 하면 됩니다.

    결론


    이 두 부분으로 구성된 시리즈에서 Linux 생태계에서 사용하는 서비스 관리 수호 프로그램을 알게 되었습니다.그리고 시스템d의 기본 원리를 연구했고 이러한 기본 원리를 실제 예시에 적용했습니다. 데이터베이스를 설정하여 다시 시작하거나 붕괴된 후에 다시 시작합니다.시스템d에 대한 더 많은 정보를 알고 싶으면 탐색man page for systemd service을 고려하십시오.