バッチモードで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結果とどのように異なるかを確認してください。

ベストアンサー1

おすすめ記事