SpringBoot服务无法读取系统变量,我重新认识了profile和bashrc

背景

CentOS服务器上,我们用Systemd部署了一个SpringBoot服务。这个服务会用ProcessBuilder去调用机器上一个C++的可执行文件。

问题描述

SpringBoot程序跑得很正常,但是我们发现C++程序却没有log输出,也就是说它从没被执行过。
查看了ProcessBuilder的返回值,是127127的意思是系统找不到对应的命令。于是我们把C++程序对应的目录(里面包括第三方动态链接库)添加到了LD_LIBRARY_PATH。怎么添加的呢?我们在~/.bash_profile脚本中添加了命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/cppFoler/

经过测试,SpringBoot服务依然无法成功调用C++程序,依然返回127。但奇怪的是,当我们直接使用java -jar命令,并且用nohup的方式令SpringBoot程序跑在后台,可以正常调用C++程序:

nohup java -jar mySpringBoot.jar

问题分析

这里就不得不说Linuxnohupservice的区别了。

  • nohup: 在linux中,我们通过终端(shell)登陆机器,会有一个进程与shell关联。当我们退出的时候(如Ctrl+C),会向该进程发送一个SIGHUP信号,进程收到信号便会自动被销毁。nohup命令的作用,是将shell中产生的输出(stdout)和错误(stderr)重定向到文件nohup.out中。当我们退出shell的时候,nohup会忽略SIGHUP信号,让相关联的程序继续运行。由此看出,nohup进程是一次性的,其本质就是让程序在原先的shell进程中继续运行
  • service: 服务是一种后台守护进程,不与任何终端(shell)关联。它是系统的一部分,可以被servicesystemctl命令方便的管理。service的具体的启动过程可以参考这篇文章

回到我们的问题,nohup的方式可以工作,而service不行,说明前面设置的LD_LIBRARY_PATH参数只对nohup生效,对service无效。这让我去重新学习了CentOS~/.bash_profile脚本,以及相关的/etc/profile~/.bashrc/etc/bashrc

  • /etc/profile: 脚本设置了一些系统级别的环境变量,它会在有用户通过终端登陆的时候被执行,做一些初始化操作。初始化时,它会去/etc/profile.d/目录下,去逐个执行.sh文件。所以,与其直接修改/etc/profile文件,不如将自定义脚本放在/etc/profile.d/下面。
    该脚本只会在交互式登陆终端(interactive - login shell)启动的时候运行,也就是它只在用户登陆的时候运行一次。以下摘自文件的注释

System wide environment and startup programs, for login setup. Functions and aliases go in /etc/bashrc. It's NOT a good idea to change this file unless you know what you are doing. It's much better to create a custom.sh shell script in /etc/profile.d/ to make custom changes to your environment, as this will prevent the need for merging in future updates.

  • /etc/bashrc: 脚本和/etc/profile类似。区别是,/etc/bashrc更侧重的是系统级别的别名(alias)。而且,该脚本只会在交互式非登陆终端(interactive - non-login shell)启动的时候运行,即在每次新打开一个shell的时候,都会执行一遍。以下摘自文件的注释

System wide functions and aliases, Environment stuff goes in /etc/profile.

  • ~/.bash_profile: 作用和/etc/profile一样,只不过作用范围只是当前用户
  • ~/.bashrc: 作用和/etc/bashrc一样,只不过作用范围只是当前用户

到这里,问题已经明朗了,我们在~/.bash_profile中设置的环境变量,只对shell所对应的进程生效,而对后台的service无效。当用nohup方式执行程序的时候,因为还是在shell对应的线程中,所以可以正常读到设置的环境变量。

问题解决

解决办法是,给service独立设置环境变量。这里有两种方式。

1. Systemd Environment

Systemd Service的配置文件中,显示指定Environment参数,来设置service运行时的环境变量,如:

[Unit]
Description=My SpringBoot Service
After=syslog.target

[Service]
User=nightfield
ExecStart=/path/to/mySpringBoot.jar
SuccessExitStatus=143
Restart=always
RestartSec=5
Environment="LD_LIBRARY_PATH=/path/to/cppFoler/"

[Install]
WantedBy=multi-user.target

这样,service运行的时候,就可以正确读到对应的变量。

2. ProcessBuild中指定environment()

ProcessBuild可以通过environment()方法,设置process运行的环境参数:

ProcessBuilder pb = new ProcessBuilder("java -version");
Map<String, String> env = pb.environment();
env.put("LD_LIBRARY_PATH", "/path/to/cppFoler/");
Process p = pb.start();

总结

通过这个问题,更深刻地学习了nohupservice的区别,profilebashrc的适用场景。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容