소켓을 통해 통신하는 두 개의 Linux 시스템(데스크톱 및 ARM 기반 개발 보드)이 있습니다.
서버가 미리 정의된 특정 메시지를 보낼 때 개발 보드에서 실행 중인 클라이언트 애플리케이션을 다시 시작(또는 재설정)하고 싶습니다. Linux를 다시 시작(다시 시작)하고 싶지 않고 클라이언트 애플리케이션이 자동으로 다시 시작되기를 원합니다.
어떻게 해야 할지 이해할 수 없습니다.
답변1
/proc/self/exe
특정 메시지가 수신되면 클라이언트가 실행되도록 합니다. 실행 파일이 파일 시스템에서 실제로 어디에 있는지 알 필요는 없습니다. main()
을 재사용하여 argv
새 매개변수 벡터를 구성할 수 있습니다.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char buf[32] = {};
char *exec_argv[] = { argv[0], buf, 0 };
int count = argc > 1 ? atoi(argv[1]) : 0;
printf("Running: %s %d\n", argv[0], count);
snprintf(buf, sizeof(buf), "%d", count+1);
sleep(1);
execv("/proc/self/exe", exec_argv);
/* NOT REACHED */
return 0;
}
이는 restart.c
다음과 같이 작동합니다:
$ gcc restart.c
$ ./a.out 3
Running: ./a.out 3
Running: ./a.out 4
Running: ./a.out 5
답변2
이를 수행하는 일반적인 방법은 프로그램을 종료한 다음 모니터링 시스템을 사용하여 다시 시작하는 것입니다. 이것init
이 프로그램은 이러한 모니터링 시스템을 제공합니다. 완전히 다른 구성 메커니즘을 가진 다양한 init 프로그램(SysVinit, BusyBox, Systemd 등)이 있습니다(구성 파일은 항상 작성되지만 파일의 위치와 구문은 다릅니다). 따라서 사용 중인 init 프로그램에 대한 문서를 찾아보세요. 을 사용하여 . 시작 시 또는 명시적 요청 시 프로그램을 시작하고 프로그램 종료 시 다시 시작하도록 init를 구성합니다. 더 고급 모니터링 프로그램이 있지만 꼭 필요한 것 같지는 않습니다. 이 접근 방식은 프로그램을 자동으로 다시 시작하는 것보다 많은 장점이 있습니다. 표준이므로 프로그램이 오류로 종료되더라도 서비스가 어떻게 만들어졌는지 신경 쓰지 않고 여러 서비스를 다시 시작할 수 있습니다.
프로세스를 종료하도록 지시하는 표준 메커니즘이 있습니다.신호. 프로그램에 TERM 신호를 보냅니다. 프로그램에서 정리를 수행해야 하는 경우 신호 처리기를 작성하세요. 그러한 명령을 보내는 관리 채널이 있는 경우 프로그램별 명령을 사용하여 채널을 종료할 수 있습니다.
답변3
클라이언트 애플리케이션이 Linux 서비스인 경우 다음 명령을 사용하여 다시 시작할 수 있습니다.
service <clientapp> restart
또는 구성을 강제로 다시 로드합니다.
service <clientapp> reload
service <clientapp> force-reload
맞춤형 애플리케이션일 가능성이 높은 경우 신호나 이벤트가 수신될 때 구성을 다시 시작하거나 다시 로드하는 기능을 코드에 포함해야 합니다. 그렇지 않은 경우 최후의 수단으로 언제든지 클라이언트 애플리케이션을 종료할 수 있습니다.
pkill -9 <clientapp>
다시 시작했지만 애플리케이션을 불확실한 상태로 남겨두기 때문에 보기 흉합니다.
답변4
때때로 프로세스가 실행 중인 것처럼 보이지만 실제로는 아무 작업도 수행하지 않는 경우가 있습니다. 이는 때때로 발생하는 코드 버그로 인해 발생할 수 있습니다. 할 수 있는 유일한 일은 재부팅하는 것인데, 이는 먼저 정지된 프로세스를 찾아 종료하는 것을 의미합니다.
프로세스(Python 서버)가 때때로 종료되지 않고 정지되는 문제가 발생합니다. 몇 시간마다 강제 종료/다시 시작하여 처리합니다. 이는 cron
문제의 프로그램을 호출하는 스크립트가 자체 프로세스 ID를 반환하는 것을 myapp.py
이상하게 grep
방해하기 때문에 발생합니다 .grep
#!/bin/sh
# This cron script restarts the server
# Look for a running instance of myapp.py
p=$(ps -eaf | grep "[m]yapp.py")
# Get the second item; the process number
n=$(echo $p | awk '{print $2}')
# If it's not empty, kill the process
if [ "$n" ]
then
kill $n
fi
# Start a new instance
python3 myapp.py