시스템 단위로 동적 날짜 사용

시스템 단위로 동적 날짜 사용

시스템 단위에서 로그 파일 이름의 일부로 날짜 출력을 사용하려고 합니다. 여기 예:

[Unit]
Description=TCS minetest server unit

[Service]
Type=simple
ExecStart=/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_$$(date +%%Y_%%m_%%d).txt
ExecReload=/bin/kill -HUP $MAINPID
User=tcs

[Install]
WantedBy=multi-user.target

하지만 로그 파일을 얻습니다.

ls /home/tcs/logs/
'debug_$(date'

현재 날짜를 로그 파일 이름으로 사용하는 방법은 무엇입니까?

답변1

이러한 유형의 구문은 직접적으로 지원되지 않습니다.system.service의 매뉴얼 페이지:

구문은 셸 구문에서 영감을 얻었지만 다음 단락에 설명된 메타 문자와 확장만 이해하며 변수는 다르게 확장됩니다. 특히 "<", "<<", "">" 및 ">>"를 사용한 리디렉션, "|"를 사용한 파이프, "&"를 사용한 백그라운드에서 프로그램 실행 및 기타 쉘 구문 요소는 지원되지 않습니다.

"다음 단락"에는 주로 기본 환경 변수 대체, 경로 검색 및 일부 C 이스케이프가 포함됩니다.

일반적으로 프로세스를 설정하기 위해 자체 쉘 스크립트를 작성한 다음 해당 스크립트를 systemd 서비스의 옵션으로 지정하여 ExecStart이러한 제한 사항을 해결할 수 있습니다.

특정 경우에는 날짜 교체를 셸에 명시적으로 전달하여 작동하게 할 수 있습니다.

ExecStart=/bin/bash -c '/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_$(date +%Y_%m_%d).txt'

답변2

동적 부분을 환경 파일에 작성하고 나중에 변수를 사용할 수 있습니다. 이 같은:

[Unit]
Description=TCS minetest server unit

[Service]
Type=simple
EnvironmentFile=-/dev/shm/tcs.env
ExecStartPre=sh -c 'echo date=$(date +%%Y_%%m_%%d) > /dev/shm/tcs.env'
ExecStart=/home/tcs/minetest/bin/minetestserver --worldname world --logfile /home/tcs/logs/debug_${date}.txt
ExecStartPost=rm /dev/shm/tcs.env
ExecReload=/bin/kill -HUP $MAINPID
User=tcs

[Install]
WantedBy=multi-user.target

여러 번 ExecStart사용할 수 있는 sh -c.ExecStartPre>>

관련 정보