머신(우분투 11.10 실행)에서 시간대를 자동으로 변경하고 데이터베이스에 올바른 값을 설정하는 스크립트를 설정하고 싶습니다 debconf
. 다음을 시도했지만 작동하지 않습니다. (결국 현재 시간대는 변경되지 않고 유지되며 명령을 수동으로 실행하면 dpkg-reconfigure tzdata
선택한 값은 실제로 이전 값입니다.)
#!/bin/sh -e
echo "tzdata tzdata/Areas select Europe" | debconf-set-selections
echo "tzdata tzdata/Zones/Europe select Madrid" | debconf-set-selections
echo "tzdata tzdata/Zones/America select " | debconf-set-selections
dpkg-reconfigure -f noninteractive tzdata
/etc/localtime
그래서 지금쯤에는 파일을 직접 조작하고 있지만 차라리 and 방식 /etc/timezone
을 선호합니다 .dpkg-reconfigure
debconf
답변1
내가 아는 가장 간단한 방법은 다음과 같습니다.
echo "Europe/Zurich" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata
답변2
debconf를 사용하려면 dpkg-reconfigure를 호출하기 전에 /etc/localtime
및 /etc/timezone
. 또한 양호하지 않은 추가 공간(귀하의 질문에서와 같이!)에 주의하세요.
따라서 (Debian Stretch에서) 작동하는 "debconf 방식"은 다음과 같습니다:
echo "tzdata tzdata/Areas select Europe" | debconf-set-selections
echo "tzdata tzdata/Zones/Europe select Madrid" | debconf-set-selections
rm -f /etc/localtime /etc/timezone
dpkg-reconfigure -f noninteractive tzdata
그 이유는 tzdata 구성 스크립트가 스마트하려고 시도하기 때문입니다. 이전에 구성했거나 사용자가 수동으로 시간대를 조작한 경우 다르게 동작합니다.
추가의
유사한 문제를 직접 디버깅하려면 먼저 다음을 수행합니다.
export DEBCONF_DEBUG=developer
다음 정보를 제공합니다.
# dpkg-reconfigure -f noninteractive tzdata
debconf (developer): starting /var/lib/dpkg/info/tzdata.config reconfigure 2018e-0+deb9u1
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0
debconf (developer): <-- CAPB backup
debconf (developer): --> 0 multiselect escape
debconf (developer): <-- SET tzdata/Areas Etc
debconf (developer): --> 0 value set
debconf (developer): <-- SET tzdata/Zones/Etc UTC
debconf (developer): --> 0 value set
debconf (developer): <-- INPUT high tzdata/Areas
debconf (developer): --> 30 question skipped
debconf (developer): <-- GO
debconf (developer): --> 0 ok
debconf (developer): <-- GET tzdata/Areas
debconf (developer): --> 0 Etc
debconf (developer): <-- INPUT high tzdata/Zones/Etc
debconf (developer): --> 30 question skipped
debconf (developer): <-- GO
debconf (developer): --> 0 ok
debconf (developer): starting /var/lib/dpkg/info/tzdata.postinst configure 2018e-0+deb9u1
debconf (developer): <-- VERSION 2.0
debconf (developer): --> 0 2.0
debconf (developer): <-- GET tzdata/Areas
debconf (developer): --> 0 Etc
debconf (developer): <-- GET tzdata/Zones/Etc
debconf (developer): --> 0 UTC
debconf (developer): <-- STOP
그것은 당신에게 그것이 강제로 있다는 것을 보여줄 것입니다세트사용자에게 요청하기 전에 값을 삭제합니다(따라서 로 설정한 값을 덮어씁니다 debconf-set-selections
).
/var/lib/dpkg/info/tzdata.config
그런 다음 shebang을 from 에서 #!/bin/sh
으로 변경 #!/bin/sh -x
하고 프로그램 흐름을 따르면 다음과 같이 됩니다.
+ [ -L /etc/localtime ]
+ readlink /etc/localtime
+ TIMEZONE=/usr/share/zoneinfo/Etc/UTC
보면 /var/lib/dpkg/info/tzdata.config
다음과 같은 것을 발견할 수 있습니다:
# If /etc/localtime is a link, update /etc/timezone
if [ -L /etc/localtime ] ; then
TIMEZONE="$(readlink /etc/localtime)"
@fiction 답변이 작동하는 이유를 설명합니다. 또한 스크립트를 자세히 살펴보면 '/etc/localtime'을 제거하면 @andrekeller 답변이 최신 데비안 버전에서도 작동한다는 것을 알 수 있습니다.
다음 버전의 데비안이 스크립트를 더욱 똑똑하게 만들고 기존 답변도 무효화될 때 이 디버깅 도움말이 도움이 되기를 바랍니다. debconf 디버깅에 대한 자세한 내용은 다음에서 찾을 수 있습니다.debconf-devel(7)
답변3
방금 Debian Stretch(9)에서는 /etc/localtime도 변경해야 한다는 것을 알았습니다. 따라서 다음과 같습니다:
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
필요합니다. 개정하기 위해안드레켈러의 답변당신은 필요합니다:
echo "Europe/Zurich" > /etc/timezone
ln -fs /usr/share/zoneinfo/`cat /etc/timezone` /etc/localtime
dpkg-reconfigure -f noninteractive tzdata