[sane-devel] Scanner Button Daemon [scanbd]: high CPU utilization

Wilhelm wilhelm.meier at fh-kl.de
Mon Nov 28 06:49:00 UTC 2011


Hello Rastislav,

just added your script to a contrib-directory of the repository.

Thank you,

Wilhelm

Am 25.11.2011 23:07, schrieb Rastislav David:
> Hello Wilhelm,
>
> scanbd starts fine and looks to be ok now on ARM and Debian Wheezy.
>
> I've unplugged and plugged back scanner and it now reacts to button presses.
>
> Thank You
>
> Rastislav
>
> I'm including my action.script which performs different tasks based on
> button for somebody to reuse.
>
> scan_dir=/var/spool/scan
> datetime=`date +%F_%H%M%S`
> filename=scan-$datetime
> send_to=machanska at seznam.cz
> #send_to=rasto at ynet.sk
>
> #logger -t "scanbd: $0" "Begin of $SCANBD_ACTION"
>
> case $SCANBD_ACTION in
>   pdf)
>    logger -t "scanbd: $0" "$SCANBD_ACTION - scanning and converting to ps"
>    scanimage -d $SCANBD_DEVICE --mode Color --resolution 150 --depth 16 |
> convert -density 150 - $scan_dir/$filename.ps
>    logger -t "scanbd: $0" "$SCANBD_ACTION - converting ps to pdf"
>    ps2pdf  -sPAPERSIZE=a4 $scan_dir/$filename.ps $scan_dir/$filename.pdf
>    rm $scan_dir/$filename.ps
>    ;;
>   scan)
>    scanimage -d $SCANBD_DEVICE --resolution 150 --mode Color --depth 16
> --format=tiff>  $scan_dir/$filename.tiff
>    ;;
>   copy)
>    logger -t "scanbd: $0" "$SCANBD_ACTION - scanning"
>    scanimage -d $SCANBD_DEVICE --resolution 300 --depth 16--format=tiff>
> $scan_d
> ir/$filename.tiff
> # | convert -density 300 - $scan_dir/$filename.ps
>    logger -t "scanbd: $0" "$SCANBD_ACTION - printing"
>    lp $scan_dir/$filename.tiff
>    rm $scan_dir/$filename.ps
>    ;;
> email)
>    logger -t "scanbd: $0" "$SCANBD_ACTION - scanning and converting to ps"
>    scanimage -d $SCANBD_DEVICE --mode Color --resolution 150 --depth 16|
> convert -density 150 - $scan_dir/$filename.ps
>    logger -t "scanbd: $0" "$SCANBD_ACTION - converting ps to pdf"
>    ps2pdf  -sPAPERSIZE=a4 $scan_dir/$filename.ps $scan_dir/$filename.pdf
>    logger -t "scanbd: $0" "$SCANBD_ACTION - sending pdf"
>    (cat<<EOCAT
> Document scanned on Canon LiDE 110
> EOCAT
> uuencode $scan_dir/$filename.pdf $scan_dir/$filename.pdf ) | mail -a
> "From: Canon scanner<some at email.sk>" -s "Document $filename" $send_to
>    rm $scan_dir/$filename.ps
>    ;;
> *)
>    logger -t "scanbd: $0" "Unhandled action request."
>    ;;
> esac
>
> On 25/Nov/11 5:27 PM, Wilhelm wrote:
>> Hi Rastislav,
>>
>> Am 25.11.2011 13:49, schrieb Rastislav David:
>>>
>>> ----- Wilhelm<wilhelm.meier at fh-kl.de>   wrote:
>>>> Hi Rastislav,
>>>>
>>>> (sorry for calling you wrong last time)
>>>>
>>>> Am 25.11.2011 10:35, schrieb Rastislav David:
>>>>> Hello Wilhelm,
>>>>>
>>>>> thank You for responding so quickly.
>>>>
>>>> you're welcome
>>>>
>>>>>
>>>>> I've closed point 2) where I've found that button called Pdf is
>>>>> found with filter file.
>>>>
>>>> good to here!
>>>>>
>>>>> I've attached scanbd.conf in my last email but I guess it didn't go
>>>>> through.
>>>>
>>>> looks good.
>>>>
>>>> I think there problem is, that with debian-testing we get a new libudev
>>>> with a non-blocking behaviour for the udev_monitor_receive_device()
>>>> function.
>>>>
>>>> I'll fix that upstream, when I discover how to switch back to the
>>>> blocking behaviour.
>>>>
>>>> In the mean time you can compile sanbd without libudev as said in the
>>>> last email.
>>>
>>> Yes.
>>> Compiled without UDEV and HAL now scanbd works as expected.
>>> scanbd is now behaving nicely with prety low CPU utilization :)
>>>
>>> Your guess at libdev was most likely correct.
>>
>> ok, sounds good.
>>
>> I just committed a fix regarding this problem. I can confirm that this
>> problem exists on debian-testing using libudev-dev-173 (but not on
>> ubuntu-oneiric using libudev-dev-172).
>>
>> Please test this new version on your system too with your scanner and
>> please send me a feedback.
>>
>> Is there anyone to test this on ubuntu precise?
>>
>>>
>>>>
>>>> So, stay tuned.
>>>
>>> Fingers crossed.
>>>
>>>>
>>>>>
>>>>> Here is scanbd.conf I'm using now:
>>>>>
>>>>> global {
>>>>>            debug   = true
>>>>>            debug-level = 1
>>>>>            user    = saned
>>>>>            group   = scanner
>>>>>            saned   = "/usr/sbin/saned"
>>>>>            saned_opt  = {}
>>>>>            saned_env  = { "SANE_CONFIG_DIR=/etc/scanbd" }
>>>>>            scanbuttond_backends_dir =
>>>>> "/usr/local/etc/scanbd/scanbuttond/backends"
>>>>>            timeout = 400
>>>>>            pidfile = "/var/run/scanbd.pid"
>>>>>            environment {
>>>>>                    device = "SCANBD_DEVICE"
>>>>>                    action = "SCANBD_ACTION"
>>>>>            }
>>>>>            function function_knob {
>>>>>                    filter = "^message.*"
>>>>>                    desc   = "The value of the function knob / wheel /
>>>>> selector"
>>>>>                    env    = "SCANBD_FUNCTION"
>>>>>            }
>>>>>            function function_mode {
>>>>>                    filter = "^mode.*"
>>>>>                    desc   = "Color mode"
>>>>>                    env    = "SCANBD_FUNCTION_MODE"
>>>>>            }
>>>>>            multiple_actions = true
>>>>>            action scan {
>>>>>                    filter = "^scan.*"
>>>>>                    numerical-trigger {
>>>>>                            from-value = 1
>>>>>                            to-value   = 0
>>>>>                    }
>>>>>                    desc   = "Scan to file"
>>>>>                    script = "/etc/scanbd/action.script"
>>>>>            }
>>>>>            action email {
>>>>>                    filter = "^email$"
>>>>>                    string-trigger {
>>>>>                            from-value  = ""
>>>>>                            to-value    = "^email.*"
>>>>>                    }
>>>>>                    desc   = "Scan to email"
>>>>>                    script = "/etc/scanbd/action.script"
>>>>>            }
>>>>>            action copy {
>>>>>                    filter = "^copy$"
>>>>>                    string-trigger {
>>>>>                            from-value  = ""
>>>>>                            to-value    = "^copy.*"
>>>>>                    }
>>>>>                    desc   = "Copy to printer"
>>>>>                    script = "/etc/scanbd/test.script"
>>>>>            }
>>>>>            action pdf {
>>>>>                    filter = "^file$"
>>>>>                    numerical-trigger {
>>>>>                            from-value = 1
>>>>>                            to-value   = 0
>>>>>                    }
>>>>>                    desc   = "Pdf"
>>>>>                    script = "/etc/scanbd/action.script"
>>>>>            }
>>>>>            action preview {
>>>>>                    filter = "^preview$"
>>>>>                    numerical-trigger {
>>>>>                            from-value = 1
>>>>>                            to-value   = 0
>>>>>                    }
>>>>>                    desc   = "Preview"
>>>>>                    script = "/etc/scanbd/action.script"
>>>>>            }
>>>>>            action globaltest {
>>>>>                         filter = "^message.*"
>>>>>                         desc   = "Test (print all env vars)"
>>>>>                         script = "/etc/scanbd/test.script"
>>>>>            }
>>>>> }
>>>>> device fujitsu {
>>>>>           filter = "^fujitsu.*"
>>>>>           desc = "Fujitsu: Test"
>>>>>           function function_knob {
>>>>>                    filter = "^function.*"
>>>>>                    desc   = "The value of the function knob / wheel /
>>>>> selector"
>>>>>                    env    = "SCANBD_FUNCTION"
>>>>>           }
>>>>>           action paperload {
>>>>>                        filter = "^page-loaded.*"
>>>>>                        desc   = "page loaded"
>>>>>                        numerical-trigger {
>>>>>                                from-value = 0
>>>>>                                to-value   = 1
>>>>>                        }
>>>>>                        script = ""
>>>>>           }
>>>>>           action paperunload {
>>>>>                        filter = "^page-loaded.*"
>>>>>                        desc   = "page unloaded"
>>>>>                        numerical-trigger {
>>>>>                                from-value = 1
>>>>>                                to-value   = 0
>>>>>                        }
>>>>>                        script = ""
>>>>>          }
>>>>>           action coveropen {
>>>>>                        filter = "^cover-open.*"
>>>>>                        desc   = "cover open"
>>>>>                        numerical-trigger {
>>>>>                                from-value = 0
>>>>>                                to-value   = 1
>>>>>                        }
>>>>>                        script = ""
>>>>>           }
>>>>>           action powersave {
>>>>>                        filter = "^power-save.*"
>>>>>                        desc   = "power save"
>>>>>                        numerical-trigger {
>>>>>                                from-value = 0
>>>>>                                to-value   = 1
>>>>>                        }
>>>>>                        script = ""
>>>>>           }
>>>>> }
>>>>> device snapscan {
>>>>>           filter = "(.*snapscan.*|.*Perfection.*)"
>>>>>           desc = "Epson"
>>>>>           action test {
>>>>>                  filter = "^message.*"
>>>>>                  desc   = "Test"
>>>>>                  script = "/usr/local/etc/scanbd/example.script"
>>>>>           }
>>>>>           action web {
>>>>>                  filter = "^web.*"
>>>>>                  desc   = "Web"
>>>>>                  script = "/usr/local/etc/scanbd/example.script"
>>>>>           }
>>>>>           action send {
>>>>>                  filter = "^send.*"
>>>>>                  desc   = "Send"
>>>>>                  script = "/usr/local/etc/scanbd/example.script"
>>>>>           }
>>>>> }
>>>>> device hp {
>>>>>           filter = "^hpaio.*"
>>>>>           desc = "HP"
>>>>>           action test {
>>>>>                  filter = ".*scan.*"
>>>>>                  desc   = "Test"
>>>>>                  script = "/usr/local/etc/scanbd/example.script"
>>>>>           }
>>>>> }
>>>>> device avision {
>>>>>           filter = "^avision.*"
>>>>>           desc = "Avision Scanner"
>>>>>           action duplex-test {
>>>>>                  filter = "^message.*"
>>>>>                  desc   = "Avision: Duplex Test"
>>>>>                  script = "/usr/local/etc/scanbd/test.script"
>>>>>                  string-trigger {
>>>>>                                 from-value  = ""
>>>>>                                 to-value    = "^.:duplex"
>>>>>                  }
>>>>>           }
>>>>> }
>>>>>
>>>>> ----- Original Message -----
>>>>> From: Wilhelm<wilhelm.meier at fh-kl.de>
>>>>> To: Rastislav David<rasto at ynet.sk>
>>>>> Cc: sane-devel at lists.alioth.debian.org
>>>>> Sent: Fri, 25 Nov 2011 07:45:58 +0100 (CET)
>>>>> Subject: Re: [sane-devel] Scanner Button Daemon [scanbd]: high CPU
>>>>> utilization
>>>>>
>>>>> Hi David,
>>>>>
>>>>> Am 24.11.2011 21:49, schrieb Rastislav David:
>>>>>> Hello all,
>>>>>>
>>>>>> I've succesfully compiled scanbd for my Canon CanoScan LiDE 110 on my
>>>>>> ARM powered NAS Linksys DNS-323 running Debian Wheezy.
>>>>>>
>>>>>> It works :) however there are few issues.
>>>>>> 1) scanbd is using 100% of CPU load and thus misses some button
>>>>>> presses
>>>>>
>>>>> looks like a config problem: please post your scanbd.conf
>>>>>
>>>>>> 2) does not react on Pdf button (nothing logged into console when
>>>>>> pressed) There are 4 buttons. [Pdf Auto-Scan Copy Email]
>>>>>
>>>>> we must check the log-file to find out the name of the pdf-button
>>>>>
>>>>>>
>>>>>> If I start daemon with: ./scanbd -df -c scanbd.conf
>>>>>>
>>>>>> I see:
>>>>>>
>>>>>> ./scanbd: debug on: level: 7
>>>>>> ./scanbd: dropping privs to uid saned
>>>>>> ./scanbd: dropping privs to uid scanner
>>>>>> ./scanbd: group scanner has member:
>>>>>> ./scanbd: saned
>>>>>> ./scanbd: drop privileges to gid: 104
>>>>>> ./scanbd: Running as effective gid 104
>>>>>> ./scanbd: drop privileges to uid: 110
>>>>>> ./scanbd: Running as effective uid 110
>>>>>> ./scanbd: dbus_init
>>>>>> ./scanbd: dbus match
>>>>>> type='signal',interface='org.freedesktop.Hal.Manager'
>>>>>> ./scanbd: sane version 1.0
>>>>>> ./scanbd: Scanning for local-only devices
>>>>>> ./scanbd: found device: genesys:libusb:001:011 Canon LiDE 110 flatbed
>>>>>> scanner
>>>>>> ./scanbd: start_sane_threads
>>>>>> ./scanbd: Starting poll thread for genesys:libusb:001:011
>>>>>> ./scanbd: Thread started for device genesys:libusb:001:011
>>>>>> ./scanbd: sane_poll
>>>>>> ./scanbd: start udev thread
>>>>>> ./scanbd: timeout: 400 ms
>>>>>> ./scanbd: udev thread started
>>>>>> ./scanbd: Iteration on dbus call
>>>>>> ./scanbd: no device from udev
>>>>>> ./scanbd: no device from udev
>>>>>> ....
>>>>>> 300x / second
>>>>>> ./scanbd: no device from udev
>>>>>> ./scanbd: no device from udev
>>>>>> ./scanbd: no device from udev
>>>>>> ./scanbd: no device from udev
>>>>>> ./scanbd: no device from udev
>>>>>> ./scanbd: found 41 options for device genesys:libusb:001:011
>>>>>> ./scanbd: sane_find_matching_options
>>>>>> ./scanbd: found 5 actions in section (null)
>>>>>> ./scanbd: checking action scan with filter: ^scan.*
>>>>>> ./scanbd: found active option[2] mode (type: 3) for device
>>>>>> genesys:libusb:001:01
>>>>>> 1
>>>>>> ./scanbd: found active option[4] preview (type: 0) for device
>>>>>> genesys:libusb:001
>>>>>> :011
>>>>>> ./scanbd: found active option[5] depth (type: 1) for device
>>>>>> genesys:libusb:001:0
>>>>>> 11
>>>>>> ./scanbd: found active option[6] resolution (type: 1) for device
>>>>>> genesys:libusb:
>>>>>> 001:011
>>>>>> ./scanbd: found active option[8] tl-x (type: 2) for device
>>>>>> genesys:libusb:001:01
>>>>>> 1
>>>>>> ./scanbd: found active option[9] tl-y (type: 2) for device
>>>>>> genesys:libusb:001:01
>>>>>> 1
>>>>>> ./scanbd: found active option[10] br-x (type: 2) for device
>>>>>> genesys:libusb:001:011
>>>>>> ./scanbd: found active option[11] br-y (type: 2) for device
>>>>>> genesys:libusb:001:011
>>>>>>
>>>>>>
>>>>>> these "no device from udev" messages are generated about 300/s which I
>>>>>> think is causing high CPU utilization.
>>>>>
>>>>> That's strange: did not see this before :-(
>>>>>
>>>>>>
>>>>>> in scandb.conf I left all devices as they were and for actions scan
>>>>>> email and copy I've changed script to /etc/scanbd/action.script.
>>>>>> This script works fine for said 3 buttons.
>>>>>>
>>>>>> Can You help where could be the issue with High CPU utilization?
>>>>>> Is there some problem with configuration?
>>>>>
>>>>> I think this has to to with the libudev. You can disable libudev at
>>>>> compile-time (and using hald if you want) loosing the capability to
>>>>> dynamically add scanners. Can you give this a try, please?
>>>>>
>>>>>>
>>>>>> Rastislav
>>>>>>
>>>>>> P.S: for scanbd to compile I had to change
>>>>>> -I/usr/local/include/dbus-1.0/include to
>>>>>> -I/usr/lib/arm-linux-gnueabi/dbus-1.0/include
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Wilhelm
>>>>
>>>
>>
>>
>


-- 
Wilhelm




More information about the sane-devel mailing list