레이아웃 : 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 스크립트의 끝.
이 오류를 방지하려면, 당신은 리눅스 나 리눅스 환경에서 직접 새 스크립트를 작성하고 복사 할 수 있습니다.