
서비스로 실행하려는 일부 데이터를 처리하기 위해 Python 스크립트를 만들었습니다. 스크립트는 데이터를 처리한 다음, 들어오는 새 데이터를 처리하기 위해 잠시 동안 휴면 상태를 유지합니다.
내 문제는 처리하려는 몇 가지 다른 데이터 소스가 있고 한 번에 하나의 데이터 소스를 처리하도록 스크립트가 작성되므로 서비스의 여러 인스턴스를 실행하고 싶다는 것입니다.
이 작업을 수행하는 몇 가지 다른 방법이 있습니다.
모든 데이터 소스를 처리하도록 스크립트를 다시 작성할 수 있습니다. 이렇게 하면 임시 용도로 사용할 수 없게 되고 추가되거나 제거된 소스를 자동 검색할 수 없기 때문에 데이터 소스 세트를 업데이트하기가 더 어려워집니다. 그래서 가능하더라도 이것은 나에게 가장 불리한 선택입니다.
처리하려는 데이터 소스에 대한 스크립트를 시작하는 래퍼 스크립트를 bash 또는 Python으로 만들 수 있습니다. 이것도 좀 엉성한 느낌이 듭니다.
각 데이터 소스에 대해 하나의 단위 파일을 만들 수 있으며, 각각은 적절한 인수를 사용하여 처리 스크립트를 호출합니다. 이렇게 하면 여러 시스템 파일(예:processing_ds1.system,processing_ds2.system 등)이 제공됩니다. 나에게는 이것이 가능한 방법처럼 느껴집니다. 그렇게 하지 말아야 할 타당한 이유가 있는 경우를 제외하고.
내가 선호하는 방법은 각 데이터 소스에 대한 인수를 사용하여 호출하거나 시스템 파일 내의 모든 인스턴스를 시작할 수 있는 하나의 시스템 파일을 만드는 것입니다.
그래서 두 가지 대안이 있습니다.
유닛 파일에 인수를 사용하는 것이 어떻게 가능합니까? 나는 postgresql이 @를 사용하여 다른 버전을 시작할 수 있다는 것을 보았습니다. 즉,
systemctl start postgres@12-main
클러스터 12-main을 시작합니다. 그런데 이것이 어떻게 이루어지나요? postgresql에 대한 관리 단위 파일을 찾을 수 없습니다.
또는
하나의 단위 파일에서 여러 서비스를 시작하는 것이 가능하고 조언할 수 있습니까?
답변1
템플릿 단위 파일을 사용할 수 있습니다.systemd.unit
예를 들어 OpenVPN의 경우: 다음 내용이 [email protected]
포함된 이름의 단위 파일을 생성할 수 있습니다 ./etc/systemd/system
[Unit]
Description=OpenVPN connection to %i
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
systemd를 실행할 때마다
systemctl start openvpn@myconfig
"myconfig"를 단위 파일의 %i로 대체합니다. 따라서 /usr/sbin/openvpn --config /etc/openvpn/myconfig.conf를 실행합니다.