pid에서 프로세스 정보(명령 등) 가져오기

pid에서 프로세스 정보(명령 등) 가져오기

나는 이 코드를 가지고 있습니다 :

     for job in `jobs -p`; do
         code=0;
         wait ${job} || code=$?
         if [[ "${code}" != "0" ]]; then
            echo "At least one job failed with exit code => ${code}" ;
            exit 1;
         fi
     done

다음 줄 바로 뒤: echo "종료 코드 => ${CODE}로 인해 하나 이상의 작업이 실패했습니다.";

다음과 같이 실패한 명령을 기록하는 줄을 추가하고 싶습니다.

     for job in `jobs -p`; do
         code=0;
         wait ${job} || code=$?
         if [[ "${code}" != "0" ]]; then
            echo "At least one job failed with exit code => ${code}" ;
            echo "The job that failed was $(ps -p ${job})"
            exit 1;
         fi
     done

joba 는 단지 자식 프로세스의 pid가 아닙니다 . 문제는 다음 줄입니다.

echo "The job that failed was $(ps -p ${job})"

별로 의미가 없습니다. pid=job이 주어지면 실제로 명령을 실행해야 합니다.

답변1

명령을 실행하면 ps프로세스가 이미 종료되었습니다. (반환 코드를 처리하고 있는 거죠?)

ps스크립트 앞부분에서 명령을 실행하고 wait변수에 저장하도록 논리를 변경하면 됩니다 .

for job in $(jobs -p); do
    process_info=$(ps -p "${job}" -o args=)
    wait "${job}" || {
        code=$?
        echo "Job running [${process_info}] failed with exit code ${code}." >&2
        exit 1
    }
done

답변2

지적한대로ps, 존재하지 않는 프로세스에서는 사용할 수 없습니다 .

bash연관 배열을 지원하는 것이 있는 경우 :

declare -A jobinfo

# collect job information
joblist=( $(jobs -p) )
for pid in "${joblist[@]}"; do
    jobinfo["$pid"]="$( ps -p "$pid" -o args= )"
done

# later...

# wait for jobs
err=0
for pid in "${joblist[@]}"; do
    if ! { wait "$pid" || ! (( code=$? )); }; then
        printf 'Got non-zero exit status (%d) from PID %d: %s\n' \
            "$code" "$pid" "${jobinfo[$pid]}"
        err=1
    fi
done

# exit 0 if all was good, exit 1 otherwise
exit "$err"

여기에서는 작업이 종료될 때까지 기다리기 전에 필요한 모든 데이터를 수집합니다. 나도 기다리고 있어요모두사용자가 처음 실패한 작업에 대한 정보만 얻는 것이 아니라 작업을 완료해야 합니다.


연관 배열을 사용하지 않고(기본적으로 macOS에서 작동해야 함 bash):

# collect job information
joblist=( $(jobs -p) )
for pid in "${joblist[@]}"; do
    jobinfo+=( "$( ps -p "$pid" -o args= )" )
done

# later...

err=0
i=0
for pid in "${joblist[@]}"; do
    if ! { wait "$pid" || ! (( code=$? )); }; then
        printf 'Got non-zero exit status (%d) from PID %d: %s\n' \
            "$code" "$pid" "${jobinfo[$i]}"
        err=1
    fi

    i=$(( i + 1 ))
done

exit "$err"

답변3

운영 체제(예: Linux)에 /proc 디렉토리가 있는 경우 /proc/$PID에서 필요한 모든 정보를 얻을 수 있습니다.

for PID in $(jobs -p); do
    dosomethingwith /proc/$PID/ # please take a look at what it contents ;-)
    done

관련 정보