배치 모드에서 Bash의 stdin 파이프를 안정적으로 감지하는 방법은 무엇입니까?

배치 모드에서 Bash의 stdin 파이프를 안정적으로 감지하는 방법은 무엇입니까?

스크립트가 배치 모드에서 실행될 때 Bash 스크립트에 대한 입력이 표준 입력으로 파이프되는지 여부를 테스트하는 방법이 필요합니다. 스크립트를 대화형으로 실행할 때 사용하는 방법(test [ -p /dev/stdin ])이 배치 모드에서 실패합니다. 특히 PBS에서는 실패하지만 SLURM 배치 대기열에서는 실패합니다. PBS 및 SLURM(터미널에 연결됨)과 배치 모드에서 대화형으로 작업할 수 있는 방법이 필요합니다.

"-p /dev/stdin" 테스트는 PBS 배치 모드에서 예상치 못한 결과를 생성합니다. 아래 테스트는 프로그램이 배치 모드에서 실행될 때마다 스크립트가 파이프를 생성하지 않더라도 프로그램이 파이프에서 표준 입력으로 데이터를 기대한다는 것을 보여줍니다. 이는 PBS가 배치 모드에서 stdin을 사용하여 일부 특수 작업을 수행한다는 것을 의미합니다(터미널에서 연결을 끊는 것 외에). 어떤 이유로든 이 동작은 일괄 작업이 동일한 방식으로 호출된 대화형 작업과 유사하게 동작한다는 전제를 위반합니다. 이 동작으로 인해 내 스크립트가 PBS의 배치 모드에서 충돌이 발생합니다.

SLURM 환경에서 실행된 동일한 테스트는 예상대로 작동하며 사용자가 표준 입력 파이프를 만들지 않는 한 표준 입력 파이프가 없다고 보고합니다.

PBS와 SLURM에서 상호 운용 가능하게 작동하는 크로스 플랫폼 솔루션이 있습니까? 첨부된 스크립트에서 볼 수 있듯이 [ ! -t 0 ] 테스트도 필요하지 않습니다.

백인

cat > ~/inp_std.sh << 'EOF'
#!/bin/bash
if [ -p /dev/stdin ]; then
    printf "[ -p /dev/stdin ] is true\n"
else
    printf "[ -p /dev/stdin ] is false\n"
fi # !stdin
if [ ! -t 0 ]; then
    printf "[ ! -t 0 ] is true\n"
else
    printf "[ ! -t 0 ] is false\n"
fi # !stdin
EOF
chmod 755 ~/inp_std.sh
cat > ~/inp_std_tst.sh << 'EOF'
#!/bin/bash
echo foo > ~/foo
printf "No pipe, no re-direction: ~/inp_std.sh\n"
~/inp_std.sh
printf "Pipe to stdin:            echo hello | ~/inp_std.sh\n"
echo hello | ~/inp_std.sh
printf "Redirection to stdin:     ~/inp_std.sh < foo\n"
~/inp_std.sh < ~/foo
EOF
chmod 755 ~/inp_std_tst.sh
qsub -A CLI115 -V -l nodes=1 -l walltime=00:30:00 -N inp_std -j oe -m e -o ~/inp_std.out ~/inp_std_tst.sh
qsub -A arpae -l walltime=00:30:00 -l nodes=1 -N inp_std -q batch -j oe -m e -o ~/inp_std.out ~/inp_std_tst.sh
sbatch -A acme --nodes=1 --time=00:30:00 --partition=debug --job-name=inp_std --mail-type=END --output=${HOME}/inp_std.out ~/inp_std_tst.sh

PBS 결과:

zender@rhea-login4g:~$ more ~/inp_std.out
No pipe, no re-direction: ~/inp_std.sh
[ -p /dev/stdin ] is true
[ ! -t 0 ] is true
Pipe to stdin:            echo hello | ~/inp_std.sh
[ -p /dev/stdin ] is true
[ ! -t 0 ] is true
Redirection to stdin:     ~/inp_std.sh < foo
[ -p /dev/stdin ] is false
[ ! -t 0 ] is true

SLURM 결과:

zender@edison05:~> more ~/inp_std.out
Running with ~/inp_std.sh:
[ -p /dev/stdin ] is false
[ ! -t 0 ] is true
Running with echo hello | ~/inp_std.sh:
[ -p /dev/stdin ] is true
[ ! -t 0 ] is true
Running with ~/inp_std.sh < foo:
[ -p /dev/stdin ] is false
[ ! -t 0 ] is true

PBS 결과의 첫 번째 줄이 정확히 동일한 스크립트에 대한 SLURM 결과와 어떻게 다른지 확인하세요.

관련 정보