서버를 다시 시작하기 위한 이 명령 세트를 더 쉽게 만드는 방법은 무엇입니까?

서버를 다시 시작하기 위한 이 명령 세트를 더 쉽게 만드는 방법은 무엇입니까?

저는 Debian Jessie 서버에서 Nginx, FCGI 및 Request Tracker를 실행하고 있습니다. Request Tracker는 Nginx에서 제공되지만 FCGI는 그 사이에 있습니다. 중요한 것은 FCGI 서버가 때때로 실패하여 RT 사용자에게 502 오류가 표시된다는 것입니다. 해결 방법은 매우 간단합니다. 하지만 지난 한 달 동안 셀 수 없이 많은 작업을 수행했기 때문입니다. 내가 주변에 없고 다른 사람이 FCGI 서버를 다시 시작해야 한다면 어려움을 겪을 수 있습니다. 게다가 서버를 멈췄다가 다시 시작하는 것도 귀찮은 일이지만 RT에 변경 사항을 적용하려면 꼭 해야 하는 일이다.

이 모든 것이 나를 이끈다: 어떻게 하면 명령을 더 쉽게 만들 수 있을까? 스크립트? 서비스이므로 /etc/init.d? 다른 것? 저는 데비안과 일반적으로 Linux를 처음 접했기 때문에 제가 선택할 수 있는 옵션이나 각각이 얼마나 관련되어 있는지 잘 모르겠습니다. 실행해야 할 명령은 다음과 같습니다.

netstat -antp | grep LIST | grep 12345

(이것은 포트 12345에 바인딩된 FCGI 서버를 찾아서 PID를 얻을 수 있습니다. PID가 8091이라고 가정해 보겠습니다.)

kill 8091
spawn-fcgi -u someUser -g someGroup -a 127.0.0.1 -p 12345 /opt/rt4/sbin/rt-server.fcgi

여기서 한 가지 중요한 점은 netstat명령이 아무것도 반환할 수 없다는 것입니다. 그렇다면 FCGI 서버가 자동으로 실패한 것이므로 kill명령을 건너뛰고 해당 명령으로 바로 이동합니다 spawn-fcgi. 그렇지 않으면 kill명령을 그대로 유지합니다.

이상적으로는 /etc/init.d/rt-fcgi-server. 하지만 PID를 먼저 찾아야 하기 때문에 프로세스를 종료하기 위해 무엇을 해야 할지 모르겠습니다. 파일 을 사용하려고 생각해봤는데 , 파일을 가지고 있어도 .pid어떻게 사용해야 하는지, 그런 파일을 어떻게 해야 할지 모르겠습니다 . spawn-fcgi그것이 내가 원하는 것을 할 것인지조차 모르겠습니다(명령 사용을 피할 수 있도록 PID를 유지하십시오 netstat).

이것이 모두 이해가 되기를 바랍니다. 나는 기본적으로 명령 /etc/init.d의 결과를 제어하기 위해 하나의 명령이나 에 연결된 무언가를 갖고 싶습니다 spawn-fcgi. 나는 나 netstat보다 Linux에 대해 잘 모르는 루트가 아닌 사용자가 로그인하여 단일 명령을 실행할 수 있기를 원합니다. 그것을 죽이기 위해 PID를 얻을 필요는 없습니다. 이렇게 하면 서버가 실패할 경우 Monit과 같은 기능을 사용하여 서버를 자동으로 다시 시작할 수 있습니다.

답변1

나는 FreeBSD 관점에서 이 답변을 작성할 예정이지만 Linux 및 Debian에 적용 가능해야 합니다. 패키지 이름과 기타 사항은 변경될 수 있습니다.

저도 마찬가지로spawn-fcgi에 불만이 있었습니다. FreeBSD에는 rc.d 스크립트가 있지만 rc.d 규칙을 따르지 않습니다(예를 들어 "다시 시작"할 수 없습니다).

그러나spawn-fcgi 매뉴얼의 맨 아래에는 감독에 대한 언급이 있습니다. 일부 검색을 통해 "daemontools"가 드러났습니다. FreeBSD에는 daemontools 및 daemontools-encore용 패키지가 있었습니다. -encore가 더 새롭고 다양한 기능을 갖고 있는 것 같아서 선택하게 되었습니다. 내 버전은 daemontools-encore 1.10_1입니다.

FreeBSD에서는 svscan을 위해 rc.d 스크립트가 제공됩니다. FreeBSD에서는 /var/service에서 하위 디렉터리를 검색하고 각 디렉터리에 대해 "감독"을 실행합니다. 나는 이 기본 구성을 수락하고 svscan_enable="YES"/etc/rc.conf에 넣었습니다. Linux의 경우 rc 스크립트에 대해서는 모르지만 /service가 기본 디렉터리라고 나와 있습니다.

/var/service 내부에서 rt-fcgi를 생성했고 rt-fcgi 내부에서 run을 생성했습니다. "실행"에는 다음이 포함됩니다.

#!/bin/sh

spawn-fcgi -u www -g www -s /tmp/rt.sock -n -- /usr/local/sbin/rt-server.fcgi

분명히 Linux에서는 사용 중인 사용자 및 그룹과 rt-server.fcgi의 위치가 필요합니다.

svscan 시스템은 프로세스 제목의 마지막 몇 줄의 오류를 광고하는 것 같습니다. 다른 옵션이 있습니다. 내 모습은 다음과 같습니다.

46495  -  IJ   0:00.01 /usr/local/bin/readproctitle service errors: ...tory (/var/run/rt44/data/gpg). GnuPG support has been disabled (/usr/local/lib/perl5/site_perl/RT/Config.pm:790)\n[52465] [Tue Mar  7 21:09:54 2017] [warning]: The requested port (443) does NOT match the configured WebPort (80).  Perhaps you should Set($WebPort, 443); in RT_SiteConfig.pm, otherwise your internal hyperlinks may be broken. (/usr/local/lib/perl5/site_perl/RT/Interface/Web.pm:1328)\n

... gnupg를 올바르게 구성하지 않았다는 의미입니다. svscan에 대한 로그를 구성하지 않으면 오류 등을 찾을 수 있는 것 같습니다.

이것은 하나의 fcgi에 비해 꽤 무거운 비트이지만 통조림으로 만들어져 작동합니다. 어떤 이유로든 스크립트 종료를 처리하지만 PID 파일이나 소켓(소켓 파일 생성 제외)을 관리하지 않습니다.

나는 이 혼란스러운 표준보다 WSGI 표준에 훨씬 더 매료되었다고 말하고 싶습니다.

관련 정보