이 명령 세트(서버 다시 시작)를 어떻게 더 쉽게 만들 수 있습니까?

이 명령 세트(서버 다시 시작)를 어떻게 더 쉽게 만들 수 있습니까?

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

이 모든 것이 나에게 다음과 같은 결론을 가져다 줍니다. 어떻게 하면 명령을 더 간단하게 만들 수 있을까요? 스크립트? 서비스이므로 에 존재합니까 /etc/init.d? 다른 것이 있습니까? 저는 Debian과 Linux를 처음 접했기 때문에 제가 선택할 수 있는 옵션이나 각 옵션의 참여 수준에 대해 잘 모릅니다. 실행해야 하는 명령은 다음과 같습니다.

netstat -antp | grep LIST | grep 12345

(이것은 PID를 얻을 수 있도록 포트 12345에 바인딩된 FCGI 서버를 찾습니다. 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. 나는 루트가 아닌 사용자(나보다 Linux에 대해 잘 아는 사람)가 로그인하여 단일 명령을 실행할 수 있기를 원하며 netstatPID를 가져오지 않고도 이 프로세스의 상태를 쿼리하여 프로세스를 종료 할 수 있습니다. . 이렇게 하면 Monit과 같은 기능을 사용하여 서버가 실패할 경우 자동으로 다시 시작할 수 있습니다.

답변1

나는 이 답변을 FreeBSD 관점에서 작성할 예정이지만 Linux와 Debian에서도 작동할 것입니다... 패키지 이름과 기타 사항은 변경될 수 있습니다.

나는 또한spawn-fcgi에 만족하지 않습니다. FreeBSD에는 rc.d 스크립트가 있지만 rc.d 규칙을 따르지 않습니다(예: "다시 시작"할 수 없음).

그러나spawn-fcgi 매뉴얼 하단에는 감독에 대한 언급이 있습니다. 몇 번의 검색 끝에 "daemontools"를 발견했습니다. FreeBSD에는 daemontools 및 daemontools-encore용 패키지가 있습니다. -앙코르는 비교적 새로운 것 같고 기능도 더 많아져서 선택했어요. 내 daemontools-encore 버전은 1.10_1입니다.

FreeBSD에서는 svscan을 위해 rc.d 스크립트가 제공됩니다. FreeBSD에서는 /var/service의 하위 디렉터리를 검색하고 각 디렉터리에 대해 "watch"를 실행합니다. 나는 이 기본 구성을 수락하고 /etc/rc.conf에 넣었습니다 svscan_enable="YES". 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 표준을 더 선호한다고 말해야 합니다.

관련 정보