현재 쉘 세션에서 스크립트가 이미 실행 중인지 확인하십시오.

현재 쉘 세션에서 스크립트가 이미 실행 중인지 확인하십시오.

인수 없이 시작하면 대화형 스크립트가 있고 현재 셸 세션에서 처음 실행될 때 ASCII 아트 로고를 인쇄하고 싶습니다. 어떻게 든 감지 할 수 있습니까?

도우미 파일을 작성하지 않고 이 작업을 수행하고 싶다는 것을 언급하는 것을 잊어버렸습니다. 쉘 내부에서 감지할 수 있습니까? 일부 프로세스 로그가 있습니까?

답변1

나는 두 가지 방법을 생각할 수 있습니다 :


첫째, 스크립트는 이름에 상위 쉘의 PID가 포함된 파일을 생성하려고 시도합니다.

#!/usr/bin/env bash
already_run_file=/tmp/${0##*/}.$PPID
if [[ ! -f $already_run_file ]]; then
    echo "ascii art"
    touch "$already_run_file"
fi
...

단점: 이러한 파일은 어떻게든 정리해야 합니다.


2: 스크립트에 대한 래퍼 함수를 ​​만듭니다. 프로그램이 호출된다고 가정 myscript하고 환경 변수가 존재하지 않으면 프로그램 호출에 "-A" 옵션을 추가합니다.

myscript() {
    if [[ ! -v MYSCRIPT_HAS_RUN ]]; then
        export MYSCRIPT_HAS_RUN=$(printf '%(%s)T' -1)  # timestamp
        set -- -A "$@"
    fi
    command myscript "$@"
}

그리고 다음에 추가하세요 myscript:

while getopts :A opt; do
    [[ $opt == A ]] && echo "$ascii_art"
done
shift $((OPTIND-1))

또는 함수에서 ASCII 아트를 인쇄합니다.

답변2

다음을 사용하여 파일의 날짜를 표시하는 간단한 방법

#!/bin/bash
me="${0##*/}"
typeset -i first=0
flag="/tmp/$USER.$me.run"
[[ -f "$flag" ]] || touch --date=yesterday "$flag"
if [ $(date "+%d") -ne $(date "+%d" -r "$flag") ] ;then
    first=1
fi

마지막으로 $first최초 1실행, 매일 첫 번째 실행 또는 0실행이 없는 경우입니다. 간섭을 피하기 위해 플래그 파일 이름은 "username.scriptname"입니다.

관련 정보