首頁 > 軟體

Linux service無法使用系統環境變數的問題及解決

2023-04-08 06:02:24

Linux service無法使用系統環境變數

詳細描述

之前在做一個mysql多範例安裝時,安裝成功,linux也能成功啟動;但是將support-files/mysqld_multi.server移動到/etc/init.d/目錄下並設定開機啟動(chkconfig xxx on)失敗;

問題探索

發現了問題,開始解決,發現service xxx start 無法啟動mysql的多範例,但是mysqld_multi start就可以使用;然後經過各種嘗試,發現在普通環境下可以列印出/etc/profile設定的mysql環境變數,但是在shell做成的service中無法列印該mysql環境變數;

我的/etc/frofile檔案:

export PATH=/usr/local/mysql/bin:$PATH

執行:可以看到是有設定的mysql環境變數的

[root@localhost init.d]# echo $PATH
/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

然後我們定義一個system V的指令碼

[root@localhost init.d]# vi /etc/init.d/mysqlmul
#!/bin/bash

#chkconfig: - 75 15
#description: test

賦予許可權並設定為service

[root@localhost init.d]#chmod +x /etc/init.d/mysqlmul
[root@localhost init.d]#chkconfig --add mysqlmul

執行service:結果可以看到是沒有mysql環境變數的

[root@localhost init.d]# service mysqlmul start
/sbin:/usr/sbin:/bin:/usr/bin

解決辦法

1、在/etc/init.d/xxx剛才設定的service中新增export PATH=/usr/local/mysql/bin:$PATH

注意:

當把一個shell指令碼放入到service中時,需要設定好PATH等環境。

service檔案中環境變數檔案的使用

測試準備

c++測試程式

LogTest.cpp內容如下:

// 測試程式碼

#include <stdio.h>
#include <iostream>

using namespace std;

int main(int argc, const char* argv[])
{
    int size = 0;
    // 解析傳入引數(argc和argv),程式碼略
    // ...
    
	cout << size <<endl;
    
	while(1);
	return 0;
}

service檔案

LogTest.service檔案

[Unit]
Description=LogTest
After=network.target 

[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/LogTest
ExecStart=/usr/local/MyTest/LogTest -s ${TESTSIZE}
ExecStop=/bin/kill -s QUIT $MAINPID
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=LogTest

[Install]
WantedBy=multi-user.target   

環境變數檔案

環境變數檔案LogTest放在/etc/sysconfig/目錄下。

# 環境變數檔案,可根據需要新增
TESTSIZE=10

測試流程

1)編譯c++測試程式,並將測試程式拷貝至/usr/local/MyTest/目錄下。

cp LogTest /usr/local/MyTest/

2)紀錄檔設定

關於紀錄檔相關設定,可檢視https://blog.csdn.net/www_dong/article/details/128053496。

3)service檔案載入

# 檔案拷貝
cp LogTest.service /usr/lib/systemd/system

# 檔案載入
systemctl daemon-reload

# 程式啟動
systemctl start LogTest

# 檢視程序是否啟動成功
ps -aux | grep LogTest

4)檢視LogTest程式紀錄檔

# 進入紀錄檔所在目錄
cd /var/log

# 檢視LogTest.log
cat LogTest.log

說明: 紀錄檔列印出10,說明整個流程成功

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com