Freenas 감옥에서 실행하고 싶은 Python 스크립트가 있습니다. 서비스 데몬 없이 작동하지만 서비스로 시작하고 싶습니다. 다음 서비스 스크립트를 만들었습니다./etc/rc.d/attendance
#!/bin/sh
# PROVIDE: attendance
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
name=attendance
rcvar=attendance_enable
load_rc_config $name
: ${attendance_enable="NO"}
pidfile="/var/run/${name}.pid"
command="/root/Zkteco/app.py"
command_interpreter=/usr/local/bin/python
run_rc_command "$1"
나도 추가했다Attend_enable = "예"/etc/rc.conf에서
내가 달릴 때,봉사참석이 시작됩니다나는 받았다
Starting attendance
limits: /root/Zkteco/app.py: No such file or directory
/etc/rc.d/attendance: WARNING: failed to start attendance
디렉토리가 존재하지만 /etc/rc.d/attendance에서 /usr/local/etc/rc.d/attendance로 이동하려고 시도했는데 작동하는 것 같았지만 백그라운드 프로세스로도 작동하지 않으며 CTRL이 있습니다. +C를 누르면 중지됩니다.
어떤 권장 사항이 있습니까? 스크립트는 fastapi와 uvicorn을 사용하는 웹앱인데, 그것과 관련이 있나요? 시작하려는 서비스에 대한 오류 로그를 보는 방법.
내가 시도한 것들
스크립트에서 pyinstaller --onefile을 사용하여 바이너리 파일을 만들었습니다. 그리고 바뀌었다
#!/bin/sh
.
.
.
command="/usr/local/bin/app"
run_rc_command "$1
이 변경으로 인해 서비스가 시작되지만 백그라운드로 전환되지는 않습니다.
답변1
의 파일은 /etc/rc.d
운영 체제의 일부로 간주되어 운영 체제에 의해 관리됩니다. 당신은해야오직./usr/local/etc/rc.d
rc.d는 서비스 관리 프레임워크입니다. 그러나 "서비스"를 생성하거나 더 정확하게는 "프로세스를 데몬화"하는 데는 아무 것도 수행하지 않습니다. 이는 "서비스"를 처리하는 통일된 방법을 제공하기 위해 존재합니다.
예상한 대로 앱이 백그라운드로 떨어지지 않으므로 종료하려면 CTRL-C를 눌러야 합니다. 당신의 기대가 일어날 일과 일치하지 않습니다. 자체적으로 데몬화(백그라운드로 이동 등)하는 것은 스크립트/프로그램/애플리케이션의 책임입니다. rc 스크립트는 단지 애플리케이션의 래퍼일 뿐입니다.
나는 귀하의 지원서와 uvicorn에 대해 잘 모릅니다. 그러나 문서에 따르면 uvicorn은 데몬 프로세스 자체를 지원하지 않는 것 같습니다. 이는 일반적으로 명령줄 인수가 지정된 경우에 발생합니다. 이에 대한 기본 테스트는 다음과 같습니다. 명령줄에서 애플리케이션을 실행하고 콘솔에서 자체적으로 분리할 수 있습니까?
이 작업을 수행하는 순수한 Python 방법을 원한다면 살펴보십시오.PEP 3143 - 표준 데몬 라이브러리.
간단한 FreeBSD 방법은 다음과 같습니다.데몬(8). 매우 간단한 예는 다음과 같습니다.
#!/bin/sh
# REQUIRE: LOGIN
. /etc/rc.subr
name=attendance
rcvar=`set_rcvar`
pidfile="/var/run/${name}.pid"
attendance_user="somenotrootuser"
command="/usr/sbin/daemon"
command_args="-c -f -P ${pidfile} -u ${attendance_user} -r /usr/local/bin/app"
load_rc_config $name
run_rc_command "$1"
(바라보다FreeBSD rc 스크립트를 만드는 쉬운 방법이 있습니까?그리고FreeBSD rc.d 스크립트가 데몬으로 시작되지 않습니다)
나는 당신이 응용 프로그램을 배치한 곳에서 /root
뭔가를 루트로 실행하는 것 같은 냄새가 나는 것을 발견했습니다. 권한이 없는 사용자로 실행하는 것이 좋습니다.
이것은 간단한 경우에 효과적입니다. 이것이 적절한 프로덕션 배포라면 조금 더 수행해야 하지만 이는 FreeBSD가 아니라 uvicorn 때문입니다. 당신이 읽으면https://www.uvicorn.org/deployment/프로덕션에서는 종종 gunicorn과 nginx를 사용하게 될 것입니다.
위의 내용은 FreeBSD에서 작업을 수행하는 "올바른" 방법입니다. FreeBSD를 즐겨 사용하신다면 이것은 배우고 사용하기에 훌륭한 도구입니다.
그러나 Python/웹 프로그래머이고 Gunicorn 등을 설정하는 것이 어렵다면 설치가 더 쉬울 수 있습니다.감독자. 패키지로 설치가 간편해요sysutils/py-supervisor/. 이는 rc/daemon의 대안으로 간주될 수 있으며 특히 Python 웹 프로젝트에 대한 더 많은 예제를 온라인에서 찾을 수 있습니다.