자동실행 프로그램 과 환경변수

crontab 또는 systemd을 통하여 부팅 초기에 자동실행되도로록 설정된 프로그램은 기본적으로 해당 사용자의 ~/.bashrc나 ~/.profile 같은 로그인 셸 환경 설정 파일은 자동으로 로드되지 않습니다. 이는 crontab 과 systemd 서비스가 비로그인(non-login) 및 비대화형(non-interactive) 셸 환경에서 실행되기 때문입니다.

프로그램이 환경변수의 값들이 필요한 경우 추가적인 설정이 필요합니다.


1.사용자 로그인 환경 변수가 적용되지 않는 이유

systemd는 기본적으로 쉘을 실행하지 않고 직접 프로그램을 실행합니다. 쉘 스크립트를 실행할 경우에도, 쉘 자체가 비로그인 셸로 실행되므로 ~/.bashrc, ~/.bash_profile 같은 파일이 로드되지 않습니다.


2. ~/.bashrc를 실행하도록 설정하려면

~/.bashrc를 수동으로 로드해야 합니다. 이를 위해 실행 스크립트(run_program.sh)에 다음을 추가할 수 있습니다.

1) 수정된 run_program.sh:

#!/bin/bash

# 사용자 환경 변수 로드
source /home/username/.bashrc

# 가상환경 활성화
source /home/username/myenv/bin/activate

# 프로그램 실행
python /home/username/myproject/start.py

# 가상환경 비활성화
deactivate

2) 서비스 파일 그대로 유지: ~/.bashrc를 로드하도록 설정했으므로 서비스 파일은 변경하지 않아도 됩니다

[Service]
ExecStart=/home/username/run_program.sh
WorkingDirectory=/home/username
User=username
Restart=always

3. 디버깅 및 확인

1) 환경변수 확인

Python 스크립트에서 환경 변수를 출력하여 올바르게 로드되었는지 확인합니다:

import os
print("PATH:", os.environ.get("PATH"))
print("MY_VARIABLE:", os.environ.get("MY_VARIABLE"))

2) systemd 로그 확인

서비스가 실행 중에 환경 변수가 제대로 설정되었는지 확인하려면

journalctl -u myprogram.service

journalctl은 Linux 시스템에서 systemd의 로그 관리를 위한 명령어입니다. 시스템의 모든 로그 메시지(부팅 로그, 서비스 상태, 애플리케이션 출력 등)를 확인하고 관리할 수 있습니다. 이는 전통적인 로그 파일(/var/log) 대신 systemd의 journald 서비스에 의해 저장된 바이너리 형식의 로그 데이터를 조회하는 데 사용됩니다.