리눅스의 systemd 서비스 구성 및 자동 재시작


레이아웃 : POST의
제목 : 리눅스의 systemd 서비스 구성 및 자동 재시작
DATE : 2019년 9월 9일
태그 : 리눅스
---

리눅스의 systemd 서비스 구성 및 자동 재시작

0 배경

리눅스에서 개발할 때, 종종 자신의 프로그램 서비스를 확인하고 서비스가 충돌 한 후, 우리는 실현의 기능에 대한 간략한 소개를 수행 자동으로 시작 다시 시작하는 서비스 및 자동 재시작 기능을 구현해야, 구현은 리눅스 시스템을 사용하는 것은 매우 간단하다 systemd가 실현 될 수있다

1 개 systemd 소개

역사적으로, 리눅스의 시작과 같은, 초기화 공정을 사용하여왔다

$ sudo /etc/init.d/apache2 start

또는

$ service apache2 start

이 방법은 두 가지 단점이있다.

첫째, 긴 시작 시간. init 프로세스는 직렬은 완료하는 과정을 시작는 다음 프로세스를 시작, 시작됩니다.
둘째, 시작 스크립트는 복잡. init 프로세스는 관계없이 다른 것들의 시작 스크립트를 실행합니다. 이 스크립트는 종종 스크립트가 매우 긴 될 수 있습니다 다양한 상황과 자신의 거래를 필요로한다.

이러한 문제 및 출산를 해결하기 위해 Systemd. 그것의 디자인 목표는 시스템의 시작 및 관리를위한 완벽한 솔루션을 제공하는 것입니다.

리눅스 규칙에 따르면, 문자 D는 약어 데몬 (데몬)입니다. 이름 Systemd 의미, 그것은 전체 시스템의 보호자가 될 것입니다. 다음 초기화를 필요로하지 마십시오 Systemd를 사용합니다. Systemd는 initd 대체 공정의 제 시스템 (PID = 1), 다른 프로세스가 자녀되었다.

시스템 관리를위한 systemctl Systemd 주요 명령. 사용자의 경우는 가장 일반적으로 사용되는 시작하고 장치 (주요 서비스)를 중지하려면 다음 명령입니다.

- 즉시 서비스를 시작

$ systemctl start apache.service

- 서비스 중지

$ systemctl stop apache.service

- 서비스를 다시 시작

$ systemctl restart apache.service

- 서비스는 모든 자식 프로세스를 종료

$ systemctl kill apache.service

- 서비스 프로필을 다시로드

$ systemctl reload apache.service

- 수정 된 모든 구성 파일을 다시로드

$ systemctl daemon-reload

- 단위의 모든 기본 매개 변수를 표시

$ systemctl show httpd.service

- 단위의 특정 속성 값을 표시합니다

$ systemctl show -p CPUShares httpd.service

- 단위의 특정 속성을 설정

$ systemctl set-property httpd.service CPUShares=500

이 문서는 systemd의 사용은 당신이 systemd의 기본 사항에 대한 자세한 내용은 원하는 경우 관련 정보에 액세스 할 수 있습니다 도입한다

2 서버 측 스크립팅

여기서 우리는 서비스를 구현하는 데 사용되는 PHP 스크립트 서비스 server.php를 쓰기

<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, '0.0.0.0', 10000);
for (;;) {
    socket_recvfrom($sock, $message, 1024, 0, $ip, $port);
    $reply = str_rot13($message);
    socket_sendto($sock, $reply, strlen($reply), 0, $ip, $port);
}

lsof 명령 실행 한 후 포트 점유를 볼 수 있습니다

lthpc@lthpc:~$ lsof -i:10000
COMMAND   PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
php     40446 lthpc    3u  IPv4 37381218      0t0  UDP *:10000 

NC 클라이언트 테스트를 사용하여 명령 시뮬레이션

$ nc -u 127.0.0.1 10000
Hello, world!
Uryyb, jbeyq!

3 서비스를 생성
, 다음 사용하는 서비스 만들기 systemd 서비스 프로필을 쓰기/etc/systemd/system/rot13.service

[Unit]
Description=ROT13 demo service
After=network.target
StartLimitIntervalSec=0
 
[Service]
Type=simple
Restart=always
RestartSec=1
User=ltpc
ExecStart=/usr/bin/env php /path/to/server.php
 
[Install]
WantedBy=multi-user.target

주의 자동으로 무제한 번 다시 시작하도록 서비스를 허용하기 위해 몇 가지 포인트가 있습니다, 다음과 같은 구성을 추가해야

StartLimitIntervalSec=0

Restart=always

RestartSec=1

구성 파일의 의미의 특정 매개 변수는 참조 문서

설정 한 후, 서비스를 시작하려면 다음 문을 실행할 수 있습니다

$ systemctl start rot13

실행 후, 그는 서비스라고 ROT13를 시작, 당신은 상태보기 서비스 상태를 사용할 수 있습니다

lthpc@lthpc:~/workspace_zong/tcptest$ systemctl status rot13
● rot13.service - ROT13 demo service
   Loaded: loaded (/etc/systemd/system/rot13.service; disabled; vendor preset: enabled)
   Active: active (running) since 一 2019-10-28 11:25:43 CST; 1min 28s ago
 Main PID: 44532 (php)
    Tasks: 1
   Memory: 5.2M
      CPU: 24ms
   CGroup: /system.slice/rot13.service
           └─44532 php /home/lthpc/workspace_zong/tcptest/server.php
 
10月 28 11:25:43 lthpc systemd[1]: Started ROT13 demo service.

자동으로 부팅 시작하려면 다음 문을 실행

$ systemctl enable rot13

마찬가지로, 당신은 NC 명령 시뮬레이션 클라이언트 테스트를 사용할 수 있습니다, 우리는 서비스가 정상 작동을 시작했다고 볼 수 있습니다!

4 자동 재시작
하면 자동으로 일반 다시 시작할 수 있는지 여부를 테스트하려면, 우리는 수동으로 서비스 프로세스가 시작 죽이고, 다음도 다시 시작 프로세스를 나타내는 프로세스 ID는 PID 번호를 대체하는 것으로 밝혀졌습니다보고, -u 127.0.0.1 10000 개 명령 테스트는 여전히 노스 캐롤라이나를 호출 할 수 있습니다 사용 서비스

$ systemctl status rot13 | grep PID
 Main PID: 44532 (php)
$ sudo kill 44532
$ systemctl status rot13 | grep PID
 Main PID: 44255 (php)

입력을 참고 systemctl stop rot13서비스가 다시 시작되지 않은 경우 매개 변수를 수정이 필요한 경우, 그래서 직접 완전히 변경하는 명령을 중지 한 다음 시작, 실행


서비스 구성 작성

vim /lib/systemd/system/website.service

[Unit]
Description=website
After=network.target
 
[Service]
Type=forking
ExecStart=/home/monitor/website/start.sh
ExecReload=/home/monitor/website/restart.sh
ExecStop=/home/monitor/website/shutdown.sh
 
[Install]
WantedBy=multi-user.target

해당 시작 쓰기 스크립트 중지
에 :

vim /home/monitor/website/start.sh
#!/bin/sh
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
 
nohup java -jar /home/monitor/website/demo-0.0.1-SNAPSHOT.jar &

닫기 :

vim /home/monitor/website/shutdown.sh
#!/bin/sh
ps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9

다시 시작

vim /home/monitor/website/restart.sh
#!/bin/sh
export JAVA_HOME=/usr/java/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
 
ps -ef | grep demo-0.0.1-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9
nohup java -jar /home/monitor/website/demo-0.0.1-SNAPSHOT.jar &

실행할 권한이 부여 :

chmod +x start.sh shutdown.sh restart.sh

의 출시 이후 구성
부팅 :systemctl enable website

시작systemctl start website

닫기 :systemctl stop website

다시 시작systemctl restart website

상태보기 :systemctl status website

서비스 구성 유효성을 다시 수정 :systemctl daemon-reload

일반적인 systemctl 오류 코드
| 코드 | DESC |
| : ------ | : ------------------------------- -------------------------- |
| 0 | 명령이 성공적으로 완료 |
| 1 | 일반 알 수없는 오류 |
| 2 | 오용 쉘 명령 |
| 126 | | 명령이 실행되지 않습니다
| 127 | 명령을 찾을 수 없습니다 |
| 128 개 | 잘못된 종료 매개 변수 |
| 128 + X | 심각한 실수 리눅스 신호 x |
| 130 | 리눅스가 신호 심각한 오류 2, 그 명령 SIGINT (Ctrl + C) 종료 |
| 203 | 누락이 확인 스크립트 실행 |
| 255 | 국경의 종료 상태 |

비고
같은 쉬 스크립트를 실행하는 것과 다음과 같은 오류를보고 :
/ 빈 / SH ^ M : 나쁜 통역 : 없음 같은 파일 또는 디렉토리
창에서 리눅스 편집기로 복사 스크립트 파일로 인한없는 창문이 아래에있는 텍스트를 편집 할 각 줄의 끝을 발생 \ n 개의 \ r을 리눅스가 N을 \된다
용액 :
입력 단자 -i Sed의 'S / \ R & LT // $'daemon.sh
Sed의 -I 'S / \ R & LT // $'daemon.sh 것 빈 교체 make-all-linux-project.sh \ (R)의 행에있어서, 상기 에러 daemon.sh 스크립트의 끝.
이 오류를 방지하려면, 당신은 리눅스 나 리눅스 환경에서 직접 새 스크립트를 작성하고 복사 할 수 있습니다.

추천

출처www.cnblogs.com/nxzblogs/p/11755972.html