태그 보관물: linux

Amazon Linux Crontab Install

✅ 1. cronie 패키지 설치

crontab 명령어는 cronie 패키지에 포함되어 있습니다. 아래 명령으로 설치하세요.

sudo yum install cronie -y

✅ 2. crond 데몬 활성화 및 실행

설치 후에는 crond 서비스(크론 데몬)를 활성화하고 실행해야 합니다.

sudo systemctl enable crond
sudo systemctl start crond

systemctl status crond

✅ 3. 사용자별 crontab 편집

설치 및 실행이 완료되면 다음 명령으로 사용자 크론 설정을 할 수 있습니다.

crontab -e


예시: 매일 5시에 쉘 스크립트를 실행

0 5 * * * /home/ec2-user/backup.sh >> /home/ec2-user/backup.log 2>&1

🔍 참고: 크론 로그 확인

Amazon Linux에서는 기본적으로 /var/log/cron 파일에 로그가 남습니다.

sudo tail -f /var/log/cron

NVIDIA 드라이버 버전 불일치

NVRM: API mismatch: the client has the version 570.124.06, but
NVRM: this kernel module has the version 550.144.03.  Please
NVRM: make sure that this kernel module and all NVIDIA driver
NVRM: components have the same version.

원인 설명

  • NVIDIA 커널 모듈(Driver)사용 중인 NVIDIA 라이브러리(Client) 의 버전이 다릅니다.
    • 커널 모듈 버전: 550.144.03
    • 클라이언트(라이브러리) 버전: 570.124.06

상황 예시

  • OS 부팅 시, 커널 모듈(예: /lib/modules/$(uname -r)/kernel/drivers/video/nvidia.ko)이 550 버전임.
  • 유저가 CUDA, cuDNN, pytorch, nvidia-docker 등에서 사용하는 nvidia-smi, libcuda.so 같은 사용자 공간 라이브러리는 570 버전임.
  • 이럴 때, NVIDIA 드라이버는 항상 버전이 동일해야 하고, 다르면 GPU가 정상 동작하지 않거나 CUDA가 인식되지 않습니다.

주로 발생하는 원인

  1. NVIDIA 드라이버 업그레이드/다운그레이드 후 재부팅 없이 사용
  2. apt/yum 등으로 패키지 설치/업데이트 후 옛날 커널 모듈이 남아 있음
  3. NVIDIA Docker, CUDA Toolkit, cuDNN, Pytorch 등 개별 설치 시 충돌
  4. 커널 업데이트 후 드라이버 재설치 안 함

해결 방법

  1. 드라이버 완전히 재설치 (추천)
    • 기존 드라이버 완전히 삭제
sudo nvidia-uninstall
sudo apt-get remove --purge nvidia-*
sudo yum remove nvidia-*
  • 모든 커널 모듈 및 라이브러리 삭제
sudo rm -rf /usr/local/cuda*
sudo rm -rf /lib/modules/$(uname -r)/kernel/drivers/video/nvidia*
sudo rm -rf /usr/lib/x86_64-linux-gnu/libnvidia*
  • 서버 재부팅
sudo reboot
# Ubuntu 예시
sudo apt-get update
sudo apt-get install nvidia-driver-570
  1. 설치 후 꼭 재부팅
sudo reboot
  1. 버전 확인
nvidia-smi
# Driver Version이 570.124.06 처럼 나와야 함


추가로 현재 설치된 드라이버/라이브러리 상태 확인 명령어:

nvidia-smi
cat /proc/driver/nvidia/version
lsmod | grep nvidia

[linux] 쉘스크립트 내에서 nohup 실행하기

#!/bin/bash
#
# ┌──────────────────────────────────────────────────────────────┐
# │   [Linux] nohup 기반 자바 애플리케이션 실행 및 프로세스 관리    │
# │   - PID 파일로 기존 프로세스 종료 후 재실행                        │
# └──────────────────────────────────────────────────────────────┘
#
# 사용 방법:
#   1. 이 스크립트를 서버에 복사합니다. (예: /usr/local/bin/run_app.sh)
#   2. 실행 권한을 부여합니다: chmod +x /usr/local/bin/run_app.sh
#   3. 애플리케이션을 실행/재실행할 때마다: ./run_app.sh
#
# 스크립트 동작 요약:
#   - program.pid 파일이 있으면, 해당 PID를 읽어와 프로세스 존재 여부를 확인하고 종료(SIGTERM → SIGKILL).
#   - nohup java -jar로 자바 애플리케이션을 백그라운드 실행.
#   - 표준 출력 및 표준 에러를 program.log로 모두 기록(Append).
#   - 새로 생성된 프로세스의 PID를 program.pid 파일에 기록.
#

# ───────────────────────────────────────────────────────────────────
# 1) 변수 설정: PID 파일, 로그 파일, JAR 파일 경로 (절대 경로 권장)
# ───────────────────────────────────────────────────────────────────
PID_FILE="/home/ubuntu/app/program.pid"
LOG_FILE="/home/ubuntu/app/program.log"
JAR_FILE="/home/ubuntu/app/program.jar"

# ───────────────────────────────────────────────────────────────────
# 2) 기존 프로세스 확인 및 종료
# ───────────────────────────────────────────────────────────────────
if [ -f "$PID_FILE" ]; then
    OLD_PID=$(cat "$PID_FILE" 2>/dev/null)
    if [ -n "$OLD_PID" ]; then
        # 2-1) PID가 실제로 실행 중인지 확인
        if ps -p "$OLD_PID" > /dev/null 2>&1; then
            echo "[INFO] 기존 프로세스(PID: $OLD_PID)를 종료합니다..."
            # 2-2) 우선 SIGTERM(SIG15)으로 정상 종료 시도
            kill -15 "$OLD_PID"
            # 2-3) 종료 대기 시간(예: 5초)
            sleep 5
            # 2-4) 여전히 프로세스가 살아 있으면 SIGKILL(SIG9)으로 강제 종료
            if ps -p "$OLD_PID" > /dev/null 2>&1; then
                echo "[WARN] SIGTERM으로 종료되지 않아 SIGKILL로 강제 종료합니다."
                kill -9 "$OLD_PID"
            fi
            echo "[INFO] 프로세스 $OLD_PID 종료 완료."
        else
            echo "[WARN] PID 파일은 존재하나, 해당 PID($OLD_PID) 프로세스가 이미 종료되어 있습니다."
        fi
    fi
    # 2-5) 이전 PID 파일 삭제
    rm -f "$PID_FILE"
    echo "[INFO] 이전 PID 파일을 삭제했습니다."
fi

# ───────────────────────────────────────────────────────────────────
# 3) 새로운 애플리케이션 백그라운드 실행 및 로그·PID 기록
# ───────────────────────────────────────────────────────────────────
echo "[INFO] 애플리케이션을 백그라운드에서 실행합니다..."
nohup java -jar "$JAR_FILE" >> "$LOG_FILE" 2>&1 &
NEW_PID=$!
echo "$NEW_PID" > "$PID_FILE"
echo "[INFO] 새 프로세스(PID: $NEW_PID)가 실행되었습니다."
echo "[INFO] 로그 파일: $LOG_FILE"
echo "[INFO] PID 파일: $PID_FILE"