专栏首页一个程序员的修炼之路Redhat6中获取LANG值为空

Redhat6中获取LANG值为空

问题描述

首先来描述一下我遇到的问题:如下图所示在我们产品中,服务脚本放置在目录/etc/init.d中,在用命令 "service xxx start" 后,脚本中启动应用程序ice_main,ice_main进程中使用命令 "locale" 来获取当前所使用的语言。但是获取的LANG的值为空......

问题追踪

首先,在安装了产品的Redhat5上查看是否存在同样的问题(检查是否是前辈遗留的历史问题),结果能够正常的获取LANG的值;初步说明代码在获取当前所使用的语言的方法没有问题;

然后,在Redhat6,shell命令行里输入 "locale" , 查看结果LANG的值并不为空:

[plain] view plaincopy

1. [root@rhel6_64_khm /]# locale

2. LANG=en_US.UTF-8

3. LC_CTYPE="en_US.UTF-8"

4. LC_NUMERIC="en_US.UTF-8"

5. LC_TIME="en_US.UTF-8"

6. LC_COLLATE="en_US.UTF-8"

7. LC_MONETARY="en_US.UTF-8"

8. LC_MESSAGES="en_US.UTF-8"

9. LC_PAPER="en_US.UTF-8"

10.LC_NAME="en_US.UTF-8"

11.LC_ADDRESS="en_US.UTF-8"

12.LC_TELEPHONE="en_US.UTF-8"

13.LC_MEASUREMENT="en_US.UTF-8"

14.LC_IDENTIFICATION="en_US.UTF-8"

15.LC_ALL=

这样问题就更加奇怪了,在我默认的知识里,shell相当于是这一系列进程的父进程,子进程应该继承父进程的环境变量。

接着,就开始进行代码审查,查看ice_main代码中是否对Redhat6平台进行了特殊处理,或者在代码中是否对环境变量进行了重新设置,结果是没有。那LANG到底在哪一步被更改了呢? 最后,当你没有任何进展的时候,就应该采用最笨的方式,从头到尾仔细检查每一个步骤。我开始从进程的源头查看,首先我们使用了命令 "service xxx start" ,这一个命令包含了三个步骤:Shell创建子进程执行service 脚本 (/sbin/service),service 脚本执行进程创建子进程执行xxx脚本,那么既然在shell中能够获取LANG的值并且不为空,那么让我们来看一下Redhat6中的/sbin/service脚本,果不其然,最后调用如下命令去执行xxx脚本:

[plain] view plaincopy

1. env -i PATH="{SERVICEDIR}/{SERVICE}"

既然看不懂env命令,那咱么就来man一下(man env):

[plain] view plaincopy

1. -i, --ignore-environment

2. start with an empty environment

对,问题就在这里,参数 "-i" 让其子进程采用空的环境变量。

那我们再一起来看看Redhat5中的/sbin/service脚本,可以看到其中虽然使用了参数'-i',但随后还是将本进程LANG的值传递给子进程,所以产品在Redhat5中执行时,可以获取非空的LANG:

[plain] view plaincopy

1. env -i LANG="TERM" "{SERVICE}"

问题解决

这个问题解决思路也比较简单,我个人有两个建议:

1. 采用命令行 "/etc/init.d/xxx" 来调用执行脚本

2. 从文件 "/etc/sysconfig/i18n" 中读取LANG的值

本文分享自微信公众号 - 一个程序员的修炼之路(CoderStudyShare),作者:iceking

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-08-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux | CentOS6.X/7.X 忘记超级用户 root 密码该怎么办?

    事情是这么一个事情,因前几周的一个周末,有点闲时间便安装了一台虚拟机,装了 CentOS7.6 版本,基础环境均配置好了,也可以使用 CRT 连接了,但是有个问...

    JiekeXu之路
  • jquery获取a标签中href值为空的连接,并提示信息

    在未上线的项目中,尤其前端开发过程中,挺频繁使用超链接,但是超链接点击之后会跳转当前的首页!(很烦心).

    十月梦想
  • 获取listbox中的值

    List<string> list=new List<string>();             for (int i = 0; i < lbLog.Ite...

  • 为什么 @Value 可以获取配置中心的值?

    由 AutowiredAnnotationBeanPostProcessor 负责来处理 @Value ,此外该类还负责处理 @Autowired 和 @Inj...

    Coder小黑
  • laravel中表单提交获取字段会将空值转换为null的解决方案

    今天在进行Laravel开发的时候,发现了比较坑的一点。 按照默认情况来说,比如表单提交,如果我们提交了这个字段,但是这个字段为空字符串。在Laravel中会自...

    魔王卷子
  • 文件atime未变问题的研究

    通过系统调用stat可以获取stat结构,其中包括:atime(accesstime), ctime(create time) 以及mtime(modify t...

    河边一枝柳
  • Listview获取选中行的值

    一般情况请注意别先删除了选中行,又去使用。那就会导致找不到选中行。。。。。哥犯了这个错误。。。找了很长时间问题

    跟着阿笨一起玩NET
  • 获取GridView中的某列值

        protected void GridView1_RowEditing(object ...

    Java架构师必看
  • Thymeleaf 获取model中的值和JS获取Model中的数据

    1:Thymeleaf 获取model中的值 访问model中的数据 //通过“${}”访问model中的属性

    王小婷
  • JS 获取URL中的参数值

    本文由 Alone88 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名 最后编辑时间为...

    Alone88
  • js获取数组中的最大值最小值

    deepcc
  • Shell的字符串处理

    在Shell编程快速入门指南一文中已经简单介绍了字符串的变量命名、截取、获取长度等操作,但通常我们对字符串的操作的需求远远不止这些,Shell本身一起已经内置了...

    用户1515472
  • 问与答83: 如何从一行含有空值的区域中获取第n个数值?

    Q:在如下图1所示,在单元格区域G3:L3中有一组分数,但是其间存在空单元格。现在我想在单元格B3至F3中使用公式来获取分数,其中单元格B3中是G3:L3中的第...

    fanjy
  • CDSW1.4的新功能

    Fayson
  • Python3中如何删除字典中值为空的键值对?

    细心的朋友会发现,这里我们对data.keys()做了一个list()操作,请大家想想为什么要做这样的一个操作呢?

    BigYoung小站
  • JavaScript ES6 (五) – 集合

    本章我们将学习 ES6 中的 Set(集合) 及 WeakSet 集合 的相关用法及使用场景。

    柳公子
  • 带你入门 JavaScript ES6 (五) 集合

    本章我们将学习 ES6 中的 Set(集合) 及 WeakSet 集合 的相关用法及使用场景。

    柳公子
  • jquery获取select多选框选中的值

    蓓蕾心晴
  • Python怎样获取字典中最大值或最小值?

    从今天每日提出一个Python相关的问题,并给予答案。也算对日常工作的一个总结记录,作为备忘录或者一个关于Python的字典,放在身边,随时查阅。

    TalkPython

扫码关注云+社区

领取腾讯云代金券