Home  >  Article  >  Operation and Maintenance  >  How to solve the problem that Linux service cannot use system environment variables

How to solve the problem that Linux service cannot use system environment variables

王林
王林forward
2023-05-16 19:28:261138browse

    Linux service cannot use system environment variables

    Detailed description

    When doing a mysql multi-instance installation before, the installation was successful, linux It can also be started successfully; however, moving support-files/mysqld_multi.server to the /etc/init.d/ directory and setting the startup (chkconfig xxx on) fails;

    Problem Exploration

    I found the problem and started to solve it. I found that service xxx start could not start multiple instances of mysql, but mysqld_multi start could be used; then after various attempts, I found that the mysql environment variables set by /etc/profile could be printed out in a normal environment, but The mysql environment variable cannot be printed in the service made by the shell;

    My /etc/frofile file:

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

    Execution: You can see that the mysql environment variable is set

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

    Then we define a system V script

    [root@localhost init.d]# vi /etc/init.d/mysqlmul
    #!/bin/bash
    
    #chkconfig: - 75 15
    #description: test

    Give permissions and set it to service

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

    Execute service: As a result, you can see that there is no mysql environment variable

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

    Solution

    1. Add export PATH=/usr/local/mysql/bin:$PATH

    ## to the service just set in /etc/init.d/xxx #Note:

    When putting a shell script into the service, you need to set the PATH and other environments.

    Use of environment variable files in service files

    Test preparation

    c Test program

    The contents of LogTest.cpp are as follows:

    // 测试代码
    
    #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 file

    LogTest.service file

    [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

    Environment variable file

    Environment variable file LogTest is placed in /etc/sysconfig /Under contents.

    # 环境变量文件,可根据需要新增
    TESTSIZE=10

    Test process

    1) Compile the c test program and copy the test program to the /usr/local/MyTest/ directory.

    cp LogTest /usr/local/MyTest/

    2) Log configuration

    For log related configuration, please view https://blog. csdn.net/www_dong/article/details/128053496.

    3) Service file loading

    # 文件拷贝
    cp LogTest.service /usr/lib/systemd/system
    
    # 文件加载
    systemctl daemon-reload
    
    # 程序启动
    systemctl start LogTest
    
    # 查看进程是否启动成功
    ps -aux | grep LogTest

    4) View LogTest program log

    # 进入日志所在目录
    cd /var/log
    
    # 查看LogTest.log
    cat LogTest.log

    Description: The log prints out 10, indicating that the entire process is successful

    The above is the detailed content of How to solve the problem that Linux service cannot use system environment variables. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete