나는 이 코드를 가지고 있습니다 :
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
job
a 는 단지 자식 프로세스의 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