서비스가 중지/다시 시작될 때 서비스에 의해 생성된 프로세스를 활성 상태로 유지합니다.

서비스가 중지/다시 시작될 때 서비스에 의해 생성된 프로세스를 활성 상태로 유지합니다.

나는 이 질문을 여러 번 받았지만 지금까지의 대답은 만족스럽지 않다는 것을 알고 있습니다. 나는 지난 며칠 동안 좋은 해결책을 찾으려고 노력해 왔으며 누군가가 나에게 올바른 방향을 알려줄 수 있기를 바랍니다.

상상하다:

  • Ubuntu 22.04에서 시스템 서비스로 웹 서버를 시작했습니다.
  • 웹 서버는 권한이 없는 애플리케이션 사용자로 실행됩니다.
  • 웹 서버는 스크립트를 시작할 수 있어야 합니다.
  • 이 스크립트는 pg_restore를 실행합니다.
  • 스크립트는 pg_restore가 실행되는 동안 웹 서버 서비스가 postgres에 연결하는 것을 방지할 수 있어야 합니다.
  • 현재는 스크립트가 웹 서버 서비스(상위)를 중지하면 해당 스크립트(하위)도 종료됩니다. 스크립트가 독립형 프로세스로 생성되는지, nohup을 사용하고 백그라운드에서 실행되는지는 중요하지 않습니다. 상위 서비스가 중지되거나 다시 시작되면 스크립트가 즉시 종료됩니다.

가능한 해결 방법 1:애플리케이션 사용자에 대해 Postgres에서 연결을 비활성화합니다.
인용하다:https://stackoverflow.com/questions/3185266/postgresql-temporarily-disable-connections
문제: 연결이 복원된 후에도 스크립트는 여전히 웹 응용 프로그램 서비스를 다시 시작해야 하며 이로 인해 스크립트가 종료됩니다.

가능한 해결 방법 2:스크립트 실행만을 위한 새 서비스를 만듭니다.
인용하다:장기 실행 독립 프로세스를 생성하는 시스템 서비스를 실행하는 "올바른" 방법은 무엇입니까?
문제: 99.9%의 시간 동안 아무것도 하지 않고 스크립트를 한 번만 실행하는 시스템 서비스를 만드는 것은 어색해 보입니다. 스크립트에는 루트 권한이 없으므로 일부 sudo 체조 없이 요청 시 서비스를 생성하는 것은 제가 누락한 것이 아닌 한 선택 사항이 아닐 수 있습니다.

가능한 해결 방법 3:웹 서버 서비스 KillMode를 "Process"로 설정합니다.
인용하다:https://stackoverflow.com/questions/32208782/cant-detach-child-process-when-main-process-is-started-from-systemd
문제: 서비스가 다시 시작되면 systemd가 정상 작동 중에 웹 서버에서 생성된 프로세스를 제대로 관리(종료)하지 못할 수 있습니다. 이로 인해 프로세스가 통제 불능 상태가 되면 시스템 리소스를 복구하기가 어려워질 수 있습니다.

가능한 해결 방법 4:임시 프로세스 제어 그룹 ala systemd-run을 만듭니다.
인용하다:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/chap-using_control_groups#sec-Creating_Transient_Cgroups_with_systemd-run
문제: systemd-run --user --scope whoami > /home/appuser/test.txt 2>&1쉘이 아닌 웹 서비스 내에서 실행하려고 하면 다음과 같은 오류 메시지가 나타납니다 Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user). 검색하고 검색한 후 다음을 시도했습니다.

  • 환경 변수를 설정 export DBUS_SESSION_BUS_ADDRESS='unix:path=/run/user/$UID/bus'하면 오류가 발생합니다 Failed to connect to bus: No such file or directory. 사람들은 이를 해결하기 위해 "일반 로그인/셸"에서 실행하는 것에 대해 이야기하지만 이는 일반 사용자가 아닌 네트워크 서비스입니다.
  • 일반적인 조언은 "sudo"와 "su"를 사용하지 않는 것입니다. 나에게도 아무 소용이 없습니다.
  • dbus패키지가 dbus-user-session설치되었습니다.

당신의 도움을 주셔서 감사합니다. 이게 나를 미치게 만들고 있어!

관련 정보