scanadf スクリプトから呼び出すと、pnmtops サブプロセスが中断されます。

scanadf スクリプトから呼び出すと、pnmtops サブプロセスが中断されます。

私はscanadf何年もこのパラメータを楽しく使用してきました。-S script --script-wait

scan_perpage私のスクリプトはConvert image data to pdf by call、pipingと呼ばれています。pnmtopsps2pdf

ただし、最近(Fedora 17から19に更新された後に疑われます)、呼び出されるスクリプトは中断され、中断されますscanadf。スクリプトはコマンドで中断されますpnmtops。コマンドpnmtops自体は、分岐した「サブ」出力フィルタが完了するのを待っていますが、pnmtops完了しません。

scan_perpageネイティブスキャナページの出力から直接スクリプトを実行するとうまくいきます。pnmtopsコマンドを直接実行しても機能します。スクリプトはscanadfviaで実行されたときにのみ中断されます。-Spnmtops

バージョン:

# rpm -q --info sane-backends
Name        : sane-backends
Version     : 1.0.23
Release     : 13.fc19

# rpm -q --info sane-frontends
Name        : sane-frontends
Version     : 1.0.14
Release     : 16.fc19

# rpm -q --info netpbm
Name        : netpbm
Version     : 10.61.02
Release     : 5.fc19

scanこれは以下を呼び出すスクリプトの出力ですscanadf -vv

$ scan -o output.pdf
Scanning...
scanadf: value for --resolution is: 300
scanadf: scanning image of size 2544x3300 pixels at 1 bits/pixel
scanadf: acquiring gray frame
Started script `/usr/local/bin/scan_perpage' as pid=10902
Scanned document scan-0001
pnmtops: Input maxval is 1.  Postscript raster will have 1 bits per
sample, so maxval = 1
pnmtops: Image will be 610.56 points wide by 792.00 points high, left
edge 0.72 points from left edge of page, bottom edge 0.00 points from
bottom of page; NOT turned to landscape orientation
pnmtops: output filter spawned: pid 10904
pnmtops: Waiting for PID 10904 to exit
Scanned 1 pages
<the script hangs here>

停止したときのプロセスツリーは次のとおりです。

10897 32072 /bin/sh /usr/local/bin/scan -o output.pdf
10898 10897 scanadf -vvv -d fujitsu -S /usr/local/bin/scan_perpage
--script-wait --resolution 300 --mode Lineart -o scan-%04d
10902 10898 /bin/bash /usr/local/bin/scan_perpage scan-0001
10903 10902 pnmtops -verbose -imagewidth 8.5 -imageheight 11 scan-0001
10904 10903 pnmtops -verbose -imagewidth 8.5 -imageheight 11 scan-0001

プロセス10904(分岐したpnmtops「出力フィルタ」)は完了しません。 strace は「読み取り」を待っていることを示します。

pnmtopsviaを呼び出すときになぜ止まるのかわかりませんがscanadf、同じファイルから直接呼び出すとうまくいきます。

また、pnmtops子プロセスを手動で終了すると、すべてが問題なく続行されます。

ベストアンサー1

netpbm管理者Bryan Hendersonによる投稿:

この症状を引き起こすバグを見つけて修正しました。 [...] Netpbm 10.64.02で修正されました。

Pnmtopsが時々中断され、時には中断される環境的な違いは、開かれたファイルの数です。 10個以上のファイルが開いている状態でPnmtopsを呼び出すと停止します。

病理が何であるか興味がある場合:子供に餌を与える導管がEOF信号を送信すると、子供は終了します。これは、パイプの転送側のファイル記述子のすべてのコピーが閉じられたときに発生します。存在しなければならない唯一のコピーは、親プロセスがデータを書き込むコピーです。ただし、子プロセスはパイプの両端にあるファイル記述子のコピーを継承する必要があります。子供がコピーを閉じない場合 送るパイプの終わりでは、子プロセスは受信側でEOFを見ることができないので、永遠に待ちます。

これは、子プロセスが自身に電力を供給するパイプの送信側コピーを閉じる必要があることを意味します。これを行い、他の同様の問題を解決するために、サブプロセスは実際に使用している2つを除いて、起動時にすべてのファイル記述子を閉じようとします。ただし、POSIXは開かれたファイル記述子のリストを知る方法を提供していないため、サブプロセスはPnmtopsがそれ以上使用しないことを知っていて、盲目的に0〜9(必要な2つを除く)を閉じます。エラーは、プログラムがプロセス固有のファイル記述子を考慮していないことです。修正は、Pnmtopsが起動時にファイルディスクリプタ0-9を閉じて、Pnmtopsが生成するすべてのパイプに0-9の範囲のファイルディスクリプタ番号を持たせ、ブラインド0-9クローズを介して閉じるようにすることです。

おすすめ記事