Como detectar com segurança stdin pipe no Bash no modo batch?

2

Eu preciso de uma maneira de testar se a entrada para o meu script Bash foi canalizada para stdin quando o script é executado no modo batch. O método que uso quando Eu executo o script interativamente (o teste [-p / dev / stdin]) falha modo de lote. Especificamente, ele falha no PBS, mas não nas filas de lotes do SLURM. Eu preciso de um método que trabalhe interativamente (conectado a um terminal) e no modo batch com PBS e SLURM.

O teste "-p / dev / stdin" produz resultados inesperados no modo batch PBS. O teste abaixo mostra que um programa espera dados de um pipe para stdin sempre que o programa é executado em modo batch, mesmo que o script não cria tal tubo. Isso implica que a PBS faz algo especial (além desconectando-o do terminal) com stdin quando em modo batch. Seja qual for o motivo, esse comportamento viola a premissa de que um lote o trabalho se comportará como um trabalho interativo chamado da mesma maneira. E esse comportamento faz com que meus scripts travem no PBS no modo em lote.

O mesmo teste executado no ambiente SLURM se comporta como esperado, e não relata nenhum canal stdin a menos que o usuário crie um.

Existe uma solução multi-plataforma que funciona de forma interativa e tanto PBS e SLURM? Como mostra o script anexo, o teste [! -t 0] não é o que eu preciso também.

Charlie

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

Resultados com 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

Resultados com o 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

Observe como a primeira linha dos resultados do PBS difere dos resultados do SLURM para o mesmo script.

    
por Charlie Zender 25.01.2017 / 01:33

0 respostas