프로그래밍/리눅스 프로그래밍

[systemd] systemd를 시용한 자가 업데이트 로직

jinkwon.kim 2022. 1. 6. 21:53
728x90
반응형

[개요]

linux상에서 프로그램 스스로 종료 시키고 재시작 하는 방법을 정리 합니다. 

 

[Flow]

1. Program A 내부에서 update를 수행 하는 스크립트를 실행 

system("nohup update.sh fork 2>&1 > /dev/null &");

을 system 명령어로 실행

 

2. "update script"는 system 명령어로 실행 되어 Prorgam A의 socket 정보 까지 모두 상속 받게 되었음으로 강제로 열려있는 fd를 종료 합니다. 

for fd in $(ls /proc/$$/fd/); do
	[ $fd -gt 2] && exec {fd}<&-
done

https://unix.stackexchange.com/questions/123413/close-all-file-descriptors-in-bash

 

Close all file descriptors in bash

Is there a way to close all the open file descriptors, without having an explicit list of them beforehand?

unix.stackexchange.com

 

3. script와 Program A의 연관성을 끊어 버리기 위해서 script를 daemon으로 다시 실행 합니다.

systemd-run --scope $0 new &

 

[update.sh 핵심 pseudocode 코드]

Systemd 일 경우

#!/bin/bash

for fd in $(ls /proc/$$/fd/); do
	[ $fd -gt 2] && exec {fd}<&-
done

if $1 == fork
	systemd-run --scope $0 new &
elif $1 == new
    update코드 수행
fi

Systemd 사용 이전 시스템 

#!/bin/bash

for fd in $(ls /proc/$$/fd/); do
	[ $fd -gt 2] && exec {fd}<&-
done

if $1 == fork
	nohup $0 new &
elif $1 == new
    update코드 수행
fi

 

 

참고 사이트

https://velog.io/@legendre13/transient-process

728x90
반응형