[C] 자신과 동일한 프로세스 이름이 가동중인지 확인하는 코드 (중복 실행 차단)

프로그래밍/C, C++|2024. 8. 27. 16:28
반응형

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>

int is_another_instance_running(const char *process_name, pid_t current_pid) {
    DIR *dir;
    struct dirent *entry;
    FILE *fp;
    char path[256], cmdline[256];

    dir = opendir("/proc");
    if (dir == NULL) {
        perror("opendir");
        return 0;
    }

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_DIR && atoi(entry->d_name) > 0) {
            snprintf(path, sizeof(path), "/proc/%s/cmdline", entry->d_name);
            fp = fopen(path, "r");
            if (fp != NULL) {
                if (fgets(cmdline, sizeof(cmdline), fp) != NULL) {
                    // 프로세스 이름이 같고 현재 프로세스가 아닌 경우
                    if (strstr(cmdline, process_name) != NULL && atoi(entry->d_name) != current_pid) {
                        fclose(fp);
                        closedir(dir);
                        return 1;  // 다른 인스턴스가 실행 중임
                    }
                }
                fclose(fp);
            }
        }
    }

    closedir(dir);
    return 0;  // 다른 인스턴스가 실행 중이지 않음
}

int main(int argc, char *argv[]) {
    pid_t current_pid = getpid();  // 현재 프로세스의 PID 가져오기
    const char *process_name = argv[0];  // 자신의 실행 파일 이름

    // 실행 파일 이름에서 경로 제거 (예: ./myprogram -> myprogram)
    const char *base_name = strrchr(process_name, '/');
    if (base_name) {
        base_name++;  // '/' 이후의 문자열을 사용
    } else {
        base_name = process_name;  // 경로가 없는 경우 원래 이름 사용
    }

    if (is_another_instance_running(base_name, current_pid)) {
        printf("이미 가동 중입니다. 프로그램을 종료합니다.\n");
    } else {
        printf("미가동 상태입니다. 프로그램을 시작합니다.\n");
        // 여기에 프로그램의 메인 코드를 작성
        while (1) {
            sleep(10);  // 예시로 무한 대기
        }
    }

    return 0;
}

반응형

댓글()

Proxmox 에서 Ubuntu VM 싱글모드 진입, root 패스워드 초기화

리눅스/DaaS|2024. 8. 27. 09:28
반응형

부팅시 Proxmox 로고에서 ESC 키를 누르면 아래와 같은 창이 출력됩니다.

Select boot device:
1. virtio disk
2. ipxe
3. legacy option rom

여기에서 1번을 선택한 후, 바로 ESC 키를 눌러야 OS부팅 선택 창이 출력되지만,

그냥 막 1, ESC 키를 연타로 번갈아 누르는게 편합니다.

 

1) 패스워드를 아는 상태에서 간단한 작업 필요시

Ubuntu 싱글모드 진입을 원할 경우 e 키 > 제일 긴 행의 맨 뒤 splash 글자 뒤에 한 칸 띄우고 single 입력 후 Ctrl+x 로 부팅합니다.

 

2) 패스워드 분실 또는 사용자 환경 로드하지 않음

Ubuntu 싱글모드 진입을 원할 경우 e 키 > 제일 긴 행의 맨 뒤 splash 글자 뒤에 한 칸 띄우고 rw init=/bin/bash 입력 후 Ctrl+x 로 부팅합니다.

필요에 따라 파일시스템 쓰기권한을 부여합니다.

# mount -o rw,remount /

 

반응형

댓글()

Proxmox VM IP 설정 방법 (Private, NAT, VXLAN)

리눅스/DaaS|2024. 8. 6. 09:26
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Incus (LXC 리눅스 컨테이너 관리자) 설치 및 설정

리눅스/DaaS|2024. 8. 2. 08:49
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Proxmox 에서 SDN (영역 및 VNets) 설정하여 네트워크 분리하기

리눅스/DaaS|2024. 7. 31. 10:05
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Kubernetes Namespace 또는 Pod 의 리소스 및 볼륨 백업하기 (Velero)

리눅스/DaaS|2024. 7. 22. 15:18
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Kubernetes 에서 네임스페이스 네트워크 격리 및 특정 포트 허용하기 (Calico)

리눅스/DaaS|2024. 7. 22. 15:05
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Proxmox VM 에서 NVIDIA GPU 장치 사용하기 (CUDA, cuDNN, TensorFlow 설치 포함)

리눅스/OS 일반|2024. 7. 16. 16:10
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

[Shell Script] 텍스트 좌우 정렬, 가운데 공백 채우기

프로그래밍/BASH SHELL|2024. 7. 5. 11:39
반응형

결과를 출력해야 하는 파일에서 아래 예제를 적용해 사용하면 됩니다.

한글은 원래 3 bytes 이지만 한글 한 글자가 영문 두 글자를 차지하므로, 2bytes 로 체크 해야 하는 것이 포인트 입니다.

한글 문자를 2 bytes 로 간주하고 문자열의 자릿수를 계산하려면, 각 문자의 유니코드 포인트를 확인하여 한글 문자인지 판단하고, 바이트 수를 계산해야 합니다.

 

# vi result.sh

#!/bin/bash

CALCULATE_LENGTH() {
    local input="$1"
    local length=$(echo -n "$input" | perl -C -Mutf8 -lpe '$_=length(join("",map{/[\x{AC00}-\x{D7AF}]/ ? "xx" : $_} split //))')
    echo "$length"
}

PRINT_ALIGNED() {
        left="$1"
        right="$2"
        total_length=60
        left_length=$(CALCULATE_LENGTH "$1")
        right_length=$(CALCULATE_LENGTH "$2")
        space_length=$((total_length - left_length - right_length))
        printf "%s%*s%s\n" "$left" "$space_length" "" "$right"
}

# 결과 파일 초기화
> a.txt

# 출력 내용 작성
PRINT_ALIGNED "티스토리 홈페이지" "100점" >> a.txt
PRINT_ALIGNED "sysdocu" "90점" >> a.txt
PRINT_ALIGNED "ID 는 sysdocu, 이름은 개발왕자" "100점" >> a.txt

cat a.txt

 

# sh result.sh

 

반응형

댓글()

VMware 가상서버 이미지를 Proxmox 로 이전하기

리눅스/OS 일반|2024. 7. 4. 13:48
보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

Debian 12.x 에서 MinIO (Object storage service) 를 파일시스템처럼 마운트하기

리눅스/OS 일반|2024. 7. 3. 13:44
반응형

원래 Object storage 는 파일시스템에 마운트 하는 형식이 아닌, API 또는 시스템 명령어를 통해 파일 (객체) 을 송수신하는 개념입니다.

그러나 S3FS-Fuse 를 설치하면 NFS 나 SMB 마운트한 것처럼 파일시스템에 마운트하여 파일 저장 및 읽기가 가능해집니다.

본 테스트는 Debian 12.x 환경에서 진행하였으나 Ubuntu 에서도 동일한 명령 사용이 가능합니다.

 

 

1. 설치

 

필수 구성 패키지를 먼저 설치합니다.

# apt -y update

# apt -y install automake autotools-dev fuse g++ git libcurl4-gnutls-dev libfuse-dev libssl-dev libxml2-dev make pkg-config

 

github 에서 소스파일을 다운로드 받아 설치합니다.

# git clone https://github.com/s3fs-fuse/s3fs-fuse.git

# cd s3fs-fuse

# ./autogen.sh

# ./configure

# make

# make install

 

 

2. 설정 및 마운트

 

사용하는 계정정보를 입력합니다.

# echo "ACCESS_KEY_ID:SECRET_ACCESS_KEY" > ~/.passwd-s3fs

# chmod 600 ~/.passwd-s3fs

 

마운트할 디렉토리를 생성하고 버킷 이름과 Object 스토리지 서버 IP, PORT 번호로 마운트 합니다.

# mkdir /data

# s3fs <bucket-name> /data -o allow_other -o use_path_request_style -o url=http://<Object 스토리지 서버 IP:PORT> -o passwd_file=~/.passwd-s3fs -o nonempty

 

마운트 된 파일시스템을 확인합니다.

# df -h
Filesystem                        Size  Used Avail Use% Mounted on
udev                              7.7G     0  7.7G   0% /dev
tmpfs                             1.6G  1.1M  1.6G   1% /run
/dev/mapper/pve-root               67G  9.9G   54G  16% /
tmpfs                             7.8G   63M  7.7G   1% /dev/shm
tmpfs                             5.0M     0  5.0M   0% /run/lock
tmpfs                             1.6G     0  1.6G   0% /run/user/0
/dev/fuse                         128M   32K  128M   1% /etc/pve
s3fs                               64P     0   64P   0% /data

 

단위가 이상하게 표시 되어도 마운트 및 파일 입출력은 잘 됩니다.

# echo test > /data/lasttest.txt
# cat /data/lasttest.txt
test

 

반응형

댓글()