Armadilloフォーラム

localtime

toyodat

2017年8月21日 20時36分

Armadillo-210のアプリケーションを日本以外で利用することになり
/etc/profileのTZ=JST-9をTZ=CST-8に変更しました。
dateコマンドでは、Mon Aug 21 16:51:19 CST 2017のようにTZの環境変数が有効となっています。
ところが、アプリケーションから呼び出す、localtime_r()の結果が+8:00でなく、+9:00のままです。
実は、同じソースのアプリがArmadillo-420でも動いています。
こちらは同じ対応で、問題無くlocaltime_r()の結果が+8:00となります。
Armadillo-420には/etc/localtimeがありますが、Armadillo-210には有りません。
この違いがあるのでしょうか?
よろしくお願いします。

コメント

at_yashi

2017年8月22日 13時06分

「アプリケーションでも、正しく環境変数 TZが設定されているにも書かわらず」ということでしょうか?

date と アプリケーションで、実行方法が違ったりしますか?

toyodat

2017年8月22日 14時26分

at_yashi様

toyodatです。

dateはコマンドラインからの実行です。
結果は
Tue Aug 22 12:58:01 CST 2017
となります。
JSTでは13:58です。
ちなみに、%echo $TZ
の結果は、CST-8 です。

アプリは下記のようなイメージです。
上記の環境変数がそのまま、継承されていると思っています。
結果は+9:00となります。


struct tm t;
time_t tx;
char stime[40];

tx = time( NULL );
 localtime_r( &tx, &t );
strftime( stime,40,"%Y-%m-%d %H:%M:%S:", &t );
printf( "%s", stime );

/etcにArmadillo-210distの/usr/share/zoneinfo/PRCをコピーしてlocaltimeにrenameしま
したが、結果は同じです。
また、上記のアプリの最初でtzset();を実行しましたが、これも結果は同じでした。

よろしくお願いします。

> 「アプリケーションでも、正しく環境変数 TZが設定されているにも書かわらず」ということでしょうか?
>
> date と アプリケーションで、実行方法が違ったりしますか?
>

takuya.murasugi

2017年8月22日 14時52分

> dateはコマンドラインからの実行です。

アプリケーションもコマンドラインからの実行で合っていますでしょうか?

あと、Armadillo-210が手元になく、Armadillo-IoT G3で確認した結果ですが、
/proc/(アプリケーションのPID)/にファイル名にenvと書かれたファイルは
ありますでしょうか?
Armadillo-IoT G3ではenvironという名前でした。

このファイルにはアプリが持つ環境変数(=呼び出し元から継承した環境変数)が記載されていますので、
そこにTZの記載があるかで、判断できるかと思います。

toyodat

2017年8月22日 15時08分

toyodatです

サポートをどうも、ありがとうございます。

armadillo-420でも、TZだけでは、うまくいかない部分がありました。
/etc/localtimeを/usr/share/zoneinfoから持ってくることにより解決しました。

アプリケーションはrc.localから起動しています。
Armadillo-210で複数のPIDがつきます。
PID毎に、environの中身が異なります。
そのうちの1つに、
/rootTZ=JST-9
の記述がありました。
正しく、継承されていません。
(うまく、いっていないので、当然ですが)

何か、次に調べることはあるでしょうか?

よろしくお願いします。

> > dateはコマンドラインからの実行です。
>
> アプリケーションもコマンドラインからの実行で合っていますでしょうか?
>
> あと、Armadillo-210が手元になく、Armadillo-IoT G3で確認した結果ですが、
> /proc/(アプリケーションのPID)/にファイル名にenvと書かれたファイルは
> ありますでしょうか?
> Armadillo-IoT G3ではenvironという名前でした。
>
> このファイルにはアプリが持つ環境変数(=呼び出し元から継承した環境変数)が記載されていますので、
> そこにTZの記載があるかで、判断できるかと思います。

toyodat

2017年8月22日 16時20分

toyodatです。

takuya.murasugiさか
らのヒントとその後の継続試験で
現象は見えてきました。

テストプログラムをコマンドラインから起動すると、
環境変数は引き継がれます。
TZ=CST-8
localtime_r()の結果も正常です。

しかし、このプログラムをcronから起動すると
環境変数は引き継がれず、
/rootTZ=JST-9
となります。

シェルからの起動では問題ありません。

この結果から、対策が分かるでしょうか?

アドバイスをいただけると幸いです。

よろしくお願いします。

> toyodatです
>
> サポートをどうも、ありがとうございます。
>
> armadillo-420でも、TZだけでは、うまくいかない部分がありました。
> /etc/localtimeを/usr/share/zoneinfoから持ってくることにより解決しました。
>
> アプリケーションはrc.localから起動しています。
> Armadillo-210で複数のPIDがつきます。
> PID毎に、environの中身が異なります。
> そのうちの1つに、
> /rootTZ=JST-9
> の記述がありました。
> 正しく、継承されていません。
> (うまく、いっていないので、当然ですが)
>
> 何か、次に調べることはあるでしょうか?
>
> よろしくお願いします。
>
>
>
>
> > > dateはコマンドラインからの実行です。
> >
> > アプリケーションもコマンドラインからの実行で合っていますでしょうか?
> >
> > あと、Armadillo-210が手元になく、Armadillo-IoT G3で確認した結果ですが、
> > /proc/(アプリケーションのPID)/にファイル名にenvと書かれたファイルは
> > ありますでしょうか?
> > Armadillo-IoT G3ではenvironという名前でした。
> >
> > このファイルにはアプリが持つ環境変数(=呼び出し元から継承した環境変数)が記載されていますので、
> > そこにTZの記載があるかで、判断できるかと思います。

ファイル ファイルの説明
test.c

takuya.murasugi

2017年8月22日 16時43分

> アプリケーションはrc.localから起動しています。

通常Linuxにユーザがログインすると~/.profileファイルが自動で読まれそこに記載のある環境変数がセットされます。
# /root/.profile等のファイルがあり、そこから/etc/profileを読み込む記述がありませんか?
恐らく/etc/profileはrootユーザや他のユーザがログインした時に、呼び出されていると思います。

ですがrc.localはシステムが実行していますので、/root/.profile等は読み込まれません。

なので、rc.local内のアプリを呼び出す前に
export TZ=CST-8
を記載してあげると、アプリにTZの設定が引き継がれると思います。

> しかし、このプログラムをcronから起動すると

crondもシステムが起動していますので、
同様にcrondを呼び出すスクリプト内でexport TZ=CST-8をしてあげればよいと思います。

ただ上記のやり方だと明示的にTZを宣言した箇所のみタイムゾーンが書き換えられ、
他の箇所ではTZが元々のJST-9で動くことになります。

一般的なやり方ではやはり/etc/localtimeでタイムゾーンを設定し、システム全体のタイムゾーンを指定する方法
になると思うのですが、Armadillo-210には存在しないとのことなので、
他のやり方があるのかは、申し訳ありませんが分かりません。

Armadillo-210のシステムのタイムゾーンを変更する正規な方法ってあるのでしょうか?

toyodat

2017年8月22日 17時11分

どうも、ありがとうございました。

この方法で、とりあえず解決できることを確認しました。

> Armadillo-210のシステムのタイムゾーンを変更する正規な方法ってあるのでしょうか?
環境をconfigし直せば、タイムゾーンはそれに適したのもになると思うのですが
結構昔の環境をさわるのは怖かったのです。
それと、実行環境のまま、海外で動かすときには、/etc/configで設定できる範囲でタイムゾーンを設定できないと困ります。

いずれにしても、ひとまず、解決です。
どうも、お世話になりました。

> > アプリケーションはrc.localから起動しています。
>
> 通常Linuxにユーザがログインすると~/.profileファイルが自動で読まれそこに記載のある環境変数がセットされます。
> # /root/.profile等のファイルがあり、そこから/etc/profileを読み込む記述がありませんか?
> 恐らく/etc/profileはrootユーザや他のユーザがログインした時に、呼び出されていると思います。
>
> ですがrc.localはシステムが実行していますので、/root/.profile等は読み込まれません。
>
> なので、rc.local内のアプリを呼び出す前に
> export TZ=CST-8
> を記載してあげると、アプリにTZの設定が引き継がれると思います。
>
> > しかし、このプログラムをcronから起動すると
>
> crondもシステムが起動していますので、
> 同様にcrondを呼び出すスクリプト内でexport TZ=CST-8をしてあげればよいと思います。
>
> ただ上記のやり方だと明示的にTZを宣言した箇所のみタイムゾーンが書き換えられ、
> 他の箇所ではTZが元々のJST-9で動くことになります。
>
> 一般的なやり方ではやはり/etc/localtimeでタイムゾーンを設定し、システム全体のタイムゾーンを指定する方法
> になると思うのですが、Armadillo-210には存在しないとのことなので、
> 他のやり方があるのかは、申し訳ありませんが分かりません。
>
> Armadillo-210のシステムのタイムゾーンを変更する正規な方法ってあるのでしょうか?