RedHat 시작/종료 스크립트

RedHat 시작/종료 스크립트

내 응용 프로그램에 대한 시작/종료 스크립트를 만들려고 하는데 이에 대한 경험이 없으므로 화면("test_screen"이라고 부르겠습니다)으로 시작하겠습니다.

처음에는 /etc/init.d에 스크립트를 생성하면 된다고 생각했습니다. 여기서 영감을 얻었어요 -https://unix.stackexchange.com/a/20361/29677.

내 응용 프로그램을 조롱하는 기본 아이디어는 다음을 사용하는 것입니다.

  • screen -d -m -S test_screen시작하다
  • screen -S test_screen -X quit종료를 위해
  • 그리고 screen –list(어떤 종류의) 상태

하지만 내가 시도 /etc/init.d/test_screen start하면

Reloading systemd:                                         [  OK  ]
Starting test_screen (via systemctl):  Failed to start test_screen.service: Unit not found.
                                                       [FAILED]

그래서 유닛을 만들어야 할 것 같습니다.

나는 전에 시도했다https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html이므로 내 유닛 파일은 다음 위치에 있습니다 /etc/systemd/system.

# cat test_screen.service
[Unit]
Description=Testing `screen` service

[Service]
Type=simple
ExecStart=/bin/screen -d -m -S test_screen
ExecStop=/bin/screen -S test_screen -X quit
Environment=
Restart=always

[Install]
WantedBy=default.target

첫 번째 질문은, 내가 그것을 가져야 하는가 /etc/init.d/test_screen start, 아니면 갖지 ExecStart말아야 하는가이다. 확실히 같은 집단은 아닌데...

어쨌든 실행되지 않습니다. /var/log/messages내가 보기 전에

Sep 19 10:54:58 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:58 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:58 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:58 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:58 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:58 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:58 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:58 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:59 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: Started Testing `screen` service.
Sep 19 10:54:59 somehostname systemd: Starting Testing `screen` service...
Sep 19 10:54:59 somehostname systemd: test_screen.service holdoff time over, scheduling restart.
Sep 19 10:54:59 somehostname systemd: start request repeated too quickly for test_screen.service
Sep 19 10:54:59 somehostname systemd: Failed to start Testing `screen` service.
Sep 19 10:54:59 somehostname systemd: Unit test_screen.service entered failed state.
Sep 19 10:54:59 somehostname systemd: test_screen.service failed.

실패한 상태가 된 이유를 어떻게 찾을 수 있나요? 모든 제안을 환영합니다.

답변1

해결한 것 같네요 screen...

먼저 매개변수를 제거했습니다 Restart=always.

작동하게 하려면 RemainAfterExit=True.

이전 init 스크립트를 사용하면 코드 위치가 명확합니다. 나머지 코드를 넣을 올바른 위치를 실제로 모르겠습니다. 단순히 에서 내 스크립트를 호출해야 합니까 ExecStart=?


배우면서 추가로 발견한 사항입니다.

상태

좋은 질문이 있습니다(저도 관심이 있다는 뜻입니다). 상태 확인을 구현하는 방법에 대해 알아보겠습니다.시스템 사용자 정의 상태 메시지?

짧은 대답은 그것이 (어쨌든) 기본적으로 작동한다는 것입니다 = 너무 많이 신경 쓸 필요가 없습니다.

그래서 내 test_screen 서비스를 위해 전화 systemctl status test_screen.service하면 얻을 수 있습니다.

● test_screen.service - Testing `screen` service
   Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2017-09-20 12:48:34 CEST; 1s ago
  Process: 36633 ExecStart=/bin/screen -d -m -S test_screen (code=exited, status=0/SUCCESS)
 Main PID: 36634 (screen)
   CGroup: /system.slice/test_screen.service
           ├─36634 /bin/SCREEN -d -m -S test_screen
           └─36635 /bin/sh

Sep 20 12:48:34 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 12:48:34 somehostname systemd[1]: Started Testing `screen` service.

...이상하게도 중지하면 상태가 실패합니다.

● test_screen.service - Testing `screen` service
   Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2017-09-20 12:51:00 CEST; 1s ago
  Process: 36805 ExecStop=/bin/screen -S test_screen -X quit (code=exited, status=0/SUCCESS)
  Process: 36633 ExecStart=/bin/screen -d -m -S test_screen (code=exited, status=0/SUCCESS)
 Main PID: 36634 (code=exited, status=1/FAILURE)

Sep 20 12:48:34 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 12:48:34 somehostname systemd[1]: Started Testing `screen` service.
Sep 20 12:51:00 somehostname systemd[1]: Stopping Testing `screen` service...
Sep 20 12:51:00 somehostname systemd[1]: test_screen.service: main process exited, code=exited, status=1/FAILURE
Sep 20 12:51:00 somehostname systemd[1]: Stopped Testing `screen` service.
Sep 20 12:51:00 somehostname systemd[1]: Unit test_screen.service entered failed state.
Sep 20 12:51:00 somehostname systemd[1]: test_screen.service failed.

내가 겪어야 했던 문제를 극복했습니다 RemainAfterExit=True(제안을 시도 Type=forking하고 옵션에 주석을 달았 기 때문에 RemainAfterExit).

목록 유닛 파일

지금은 재현할 수 없는 문제에 봉착했습니다. 시도하면 systemctl start"단위 파일 없음"과 같은 응답이 나오므로 어떻게든 등록해야 하는지 궁금합니다.

아니요, 그럴 필요는 없습니다. 실행할 수 systemctl list-unit-files --type=service있으며 거기에서 유닛을 볼 수 있습니다. 내 문제는 ExecStart매개 변수가 잘못되었다는 것입니다. 지금 동일한 작업을 시도하면 메시지를 더 쉽게 이해할 수 있습니다.

$ systemctl start test_screen.service
Job for test_screen.service failed because the control process exited with error code. See "systemctl status test_screen.service" and "journalctl -xe" for details.

$ systemctl status test_screen.service
● test_screen.service - Testing `screen` service
   Loaded: loaded (/etc/systemd/system/test_screen.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2017-09-20 12:55:53 CEST; 1min 3s ago
  Process: 37344 ExecStart=/bin/screen2 -d -m -S test_screen (code=exited, status=203/EXEC)
 Main PID: 36634 (code=exited, status=1/FAILURE)

Sep 20 12:55:53 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 12:55:53 somehostname systemd[37344]: Failed at step EXEC spawning /bin/screen2: No such file or directory
Sep 20 12:55:53 somehostname systemd[1]: test_screen.service: control process exited, code=exited status=203
Sep 20 12:55:53 somehostname systemd[1]: Failed to start Testing `screen` service.
Sep 20 12:55:53 somehostname systemd[1]: Unit test_screen.service entered failed state.
Sep 20 12:55:53 somehostname systemd[1]: test_screen.service failed.

스크립트 실행

스크립트를 호출하기 위해 test_screen을 수정해 보았습니다.

$ cat /etc/systemd/system/test_screen_script.service
[Unit]
Description=Testing `screen` service

[Service]
Type=forking
ExecStart=/root/test_screen_start.sh
ExecStop=/root/test_screen_stop.sh
#Environment=
#Restart=always
RemainAfterExit=True

[Install]
WantedBy=default.target

그리고 스크립트는 이전 호출에 대한 래퍼일 뿐입니다.

$ cat /root/test_screen_start.sh
/bin/screen -d -m -S test_screen
$ cat /root/test_screen_stop.sh
/bin/screen -S test_screen -X quit

이렇게 하면 시작되지 않습니다.

$ systemctl start test_screen_script
Job for test_screen_script.service failed because the control process exited with error code. See "systemctl status test_screen_script.service" and "journalctl -xe" for details.

$ systemctl status test_screen_script.service
● test_screen_script.service - Testing `screen` service
   Loaded: loaded (/etc/systemd/system/test_screen_script.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2017-09-20 15:47:59 CEST; 8s ago
  Process: 63582 ExecStart=/root/test_screen_start.sh (code=exited, status=203/EXEC)
 Main PID: 60698 (code=exited, status=0/SUCCESS)

Sep 20 15:47:59 somehostname systemd[1]: Starting Testing `screen` service...
Sep 20 15:47:59 somehostname systemd[63582]: Failed at step EXEC spawning /root/test_screen_start.sh: Exec format error
Sep 20 15:47:59 somehostname systemd[1]: test_screen_script.service: control process exited, code=exited status=203
Sep 20 15:47:59 somehostname systemd[1]: Failed to start Testing `screen` service.
Sep 20 15:47:59 somehostname systemd[1]: Unit test_screen_script.service entered failed state.
Sep 20 15:47:59 somehostname systemd[1]: test_screen_script.service failed.

누군가가 이유를 설명할 수 있다면 좋을 것입니다. 이 문제에 대한 해결책은 를 추가하는 것입니다 #!/bin/bash.

인용하다

관련 정보