ubuntuusers.de

scanbd

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist mit keiner aktuell unterstützten Ubuntu-Version getestet! Bitte teste diesen Artikel für eine Ubuntu-Version, welche aktuell unterstützt wird. Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

scanbd (Scan Button Daemon) stellt einen Dienst, der auf Tastendrucke und ggf. andere Meldungen von SANE-fähigen Scannern lauscht. Auf diese Impulse hin können Befehle ausgeführt werden (z.B. Skripte gestartet werden), die Scanner-Funktionen einsetzen, ohne dass direkt eine Scannersoftware verwendet werden muss. So kann z.B. ein Scanner, der an eine Server angeschlossen ist, direkt über die Tasten am Gerät verwendet werden. scanbd verwendet das net-Backend, und einen weiteren Deamon (scanbm), der zwischengeschaltet wird, um bei Verwendung/Anfragen anderer Geräte das Polling zu unterbrechen. scandb kann als Ersatz für scanbuttond verwendet werden, das ab Ubuntu 16.04 nicht mehr in den Quellen ist und seit 2007 nicht mehr weiterentwickelt wurde, allerdings leider nicht als 1:1-Ersatz. Voraussetzung für die Nutzung von scanbd ist eine funktionierender SANE-Server, von dem aus auch direkt auf lokal angeschlossene Scanner zugegriffen werden kann.

Wiki/Icons/synaptic.png

Installation

Aus den offiziellen Quellen

scanbd ist ab Ubuntu 16.04 in den offiziellen Paketquellen enthalten, folgendes Paket muss installiert[1] werden:

  • scanbd (universe)

Befehl zum Installieren der Pakete:

sudo apt-get install scanbd 

Oder mit apturl installieren, Link: apt://scanbd

Aus dem Quellcode

Ggf. funktioniert die Version aus den Quellen nicht einwandfrei (siehe 1747115), oder die Tasten werden von der Standard-Version nicht erkannt. Dann kann es helfen, das Programm in aktueller Version aus dem Quellcode zu erstellen. Benötigt werden dafür neben den üblichen Werkzeugen folgende Pakete:

  • libconfuse-dev (universe)

  • libdbus-1-dev

  • libsane-dev

  • libusb-dev

  • pkg-config

  • libsane-dev

  • libudev-dev

Befehl zum Installieren der Pakete:

sudo apt-get install libconfuse-dev libdbus-1-dev libsane-dev libusb-dev pkg-config libsane-dev libudev-dev 

Oder mit apturl installieren, Link: apt://libconfuse-dev,libdbus-1-dev,libsane-dev,libusb-dev,pkg-config,libsane-dev,libudev-dev

Den Code von der Projektseite herunterladen, das Archiv entpacken[3], kompilieren[4] und installieren.

Funktionsweise

Um die Impulse erkennen zu können, öffnet scanbd das Gerät und blockiert so den Scanner für andere Anwendungen. Um dieses Problem zu umgehen, wird ein weiterer Daemon eingesetzt, der für die Zeit, in der anderweitig auf den Scanner zugegriffen werden soll, das Polling unterbricht. Dazu wird scanbm (der "Manager-Modus" von scanbd) statt saned als Netzwerk-Daemon verwendet. Er wird quasi als "Proxy" eingesetzt, der ein dbus-Signal an scanbd sendet, wenn andere Anfragen eingehen. Daraufhin wird der reguläre saned-Dienst eingesetzt, um einen Scan zu starten und die Ergebnisse an die anfragende Anwendung zu senden. Danach übernimmt wieder scanbm und sendet scanbd den Auftrag, das Polling wieder aufzunehmen.

Um das zu ermöglichen, müssen die Standard-Einstellungen für SANE so angepasst werden, dass von scanbd gestartete Scanner-Anwendungen auf den lokal angeschlossenen Scanner über das net-backend zugreifen können.

Hinweis:

Die gleichzeitige Verwendung von scanbd (genauer dem scanbm.socket) und dem saned-Daemon schließen sich gegenseitig aus.

Scanner-Tasten

Ob die Tasten am Scanner erkannt werden sollten, kann im Terminal[2] mit dem Aufruf von scanimage -A überprüft werden. Die erkannten Tasten ("Sensors") werden am Ende der Ausgabe aufgeführt, für einen Canon LiDE 220 sind das z.B. Folgende:

All options specific to device `genesys:libusb:003:005':
  Scan Mode:
...
  Sensors:
    --scan[=(yes|no)] [no] [hardware]
        Scan button
    --file[=(yes|no)] [no] [hardware]
        File button
    --email[=(yes|no)] [no] [hardware]
        Email button
    --copy[=(yes|no)] [no] [hardware]
        Copy button
    --extra[=(yes|no)] [no] [hardware]
        Extra button
  Buttons:
    --clear-calibration
        Clear calibration cache

Bei einem CanoScan N670U sind die Tasten unter "Buttons" zu finden:

All options specific to device `net:debian.fritz.box:plustek:libusb:001:003':
[...]
  Buttons:
    --button 0[=(yes|no)] [no] [hardware]
        This option reflects the status of the scanner buttons.
    --button 1[=(yes|no)] [no] [hardware]
        This option reflects the status of the scanner buttons.
    --button 2[=(yes|no)] [no] [hardware]
        This option reflects the status of the scanner buttons.
    --button 3[=(yes|no)] [inactive]
        This option reflects the status of the scanner buttons.
    --button 4[=(yes|no)] [inactive]
        This option reflects the status of the scanner buttons.

scanbuttond-Backends einsetzen

Wenn, etwa bei älterer Hardware, die Tasten des Scanners nicht erkannt werden, kann es helfen, bei ./configure die Option --enable-scanbuttond zu verwenden. Damit kann scandb auf scanbuttond-Backends zurückgreifen (z.B. für einem CanoScan LiDE 60 nötig). Die unterstützten Backends findet man in /usr/local/lib/scanbd/scanbuttond/backends, in scandb.conf muss die Nutzung in der entsprechende Freigabesektion aktiviert werden.

Funktionstest

Um nähere Informationen darüber zu erlangen, welche Tasten scanbd erkennt, kann zunächst im Terminal ein Aufruf mit dem Befehl

scanbd -f -d7 

erfolgen. Dazu muss der SANE-Daemon ausgeschaltet sein (mit sudo systemctl stop saned.socket) und es darf keine weitere scanbd Instanz laufen ('sudo systemctl stop scanbd.service' wenn der Dienst vorher gestartet wurde), sonst erkennt scanbd keine Scanner. Mit dem Befehl läuft scanbd im Vordergrund im höchsten "debugging"-Level, im Terminal erscheinen zunächst die Angaben zum Gerät sowie Ergebnisse die Standard-Filter-Abfragen, die in der scandb.conf vorgesehen sind, so z.B.

scanbd: checking action scan with filter: ^scan.*
...
scanbd: checking action email with filter: ^email$
...
scanbd: checking action copy with filter: ^copy$
...

Danach erfolgt das Logging der Abfragen für die gefundenen Optionen, z.B. etwas wie

scanbd: Start the polling for device genesys:libusb:003:005
scanbd: polling thread for genesys:libusb:003:005, before cancellation point
scanbd: polling thread for genesys:libusb:003:005, after cancellation point
scanbd: polling device genesys:libusb:003:005
scanbd: get_sane_option_value
scanbd: checking option preview number 4 (0) for device genesys:libusb:003:005: value: 0

Beim Drücken einer der Tasten sollte sich die value-Angabe in der letzten Zeile auf den Wert 1 ändern, wenn diese Option durch eine der Tasten ausgelöst wird. Wenn beim Tastendruck keine Veränderung erfolgt, werden die Tasten von scanbd nicht erkannt. Ggf. muss sichergestellt werden, dass die Filter in scandb.conf bzw. in der evtl. darin includierten Scannerspezifischen Konfiguratiosdatei aus ./scanner.d/ den Bezeichnungen der Scanner-Tasten aus scanimage -A entsprechen (s. Konfiguration).

Hinweis:

Falls

'scanbd: SANE_CONFIG_DIR not set'

angezeigt wird, den o.g. Befehl durch

SANE_CONFIG_DIR=/etc/scanbd scanbd -f -d7 

ersetzen.

Konfiguration

scanbd ist voll mit systemd kompatibel, und benötigt keine Dienste, um den Dienst scanbm zu starten. Diese Möglichkeit existiert weiterhin und kann bei Bedarf verwendet werden (wird hier nicht ausgeführt, siehe aber z.B. diese Anleitung 🇩🇪 auf bbb.archlinux.de).

saned neu konfigurieren

dll.conf

  • /etc/sane.d/dll.conf wird so in einem Editor mit Root-Rechten bearbeitet, dass nur der Eintrag net existiert, alle anderen Eintrage werden gelöscht oder auskommentiert.

  • In /etc/scanbd/dll.conf hingegen, darf net nicht auftauchen, dort nur die tatsächlich benötigten backends eintragen.

net.conf

In der Datei /etc/sane.d/net.conf werden die Einträge

# saned lokal, langer timeout unnoetig
connect_timeout = 3
# scanbm lauscht an localhost
localhost

benötigt.

scanbd.conf anpassen

Hinweis:

Bestehende systemd-Units werden am sichersten mit dem Befehl

sudo systemctl edit --full NAME_DER_UNIT_DATEI 

bearbeitet, es wird damit der eingerichtete System-Editor aufgerufen, die Datei wird dann nach /etc/systemd/system kopiert, und die Unit neugestartet. (siehe Bestehende Units editieren).

debug-level

Während sich für die Einrichtung und Fehlersuche die höchste Stufe (7) eignet, empfiehlt es sich für den Betrieb auf 2 zu wechseln um syslog nicht mehrmals pro Sekunde zuzumüllen.

Filter anpassen

Die Filter in scanbd.conf oder den Konfigurationsdateien in ./scanner.d können in einem Editor[5] mit Root-Rechten[6] angepasst werden.

  • Z.B. für einen CanoScan 220 LiDE, der eine "Weiter"-Taste hat - unter Windows zum Erstellen von mehrseitigen PDFs - mit dem zusätzliche Eintrag

        action extras {
                filter = "^extra$"
                string-trigger {
                        from-value  = ""        
                        to-value    = "^extra.*"
                }
                desc   = "whatever" # frei wählbar
                # script must be an relative path starting from scriptdir (see above), 
                # or an absolute pathname. 
                # It must contain the path to the action script without arguments
                # Absolute path example: script = "/some/path/foo.script 
                script = "test.script"
        }
  • Für einen CanoScan N670U muss eine Konfigurationsdatei ./scanner.d/plustek.conf angelegt und in scanbd.conf unter # include mit include(scanner.d/plustek.conf) eingefügt werden:

device plustek {
        
        # the device matching string
        filter = "^plustek.*"

        # the device description
        desc = "Plustek Scanner"

        # device specific actions
        # (overriding previously defined matching actions)
        action email {
                filter = "^button 0.*"
                numerical-trigger {
                  from-value = 1
                  to-value   = 0
                }
                desc   = "Scan to e-mail"

                # script must be an relative path starting from scriptdir (see above), 
                # or an absolute pathname. 
                # It must contain the path to the action script without arguments
                # Absolute path example: script = "/some/path/foo.script 
                script = "test.script"
        }
        action copy {
                filter = "^button 1.*"
                numerical-trigger {
                  from-value = 1
                  to-value   = 0
                }
                desc   = "Scan to printer"

                # script must be an relative path starting from scriptdir (see above), 
                # or an absolute pathname. 
                # It must contain the path to the action script without arguments
                # Absolute path example: script = "/some/path/foo.script 
                script = "test.script"
        }
        action scan {
                filter = "^button 2.*"
                numerical-trigger {
                  from-value = 1
                  to-value   = 0
                }
                desc   = "Scan to file"

                # script must be an relative path starting from scriptdir (see above), 
                # or an absolute pathname. 
                # It must contain the path to the action script without arguments
                # Absolute path example: script = "/some/path/foo.script 
                script = "test.script"
        }
}

Experten-Info:

Der Name canon.conf im Verzeichnis scanner.d ist etwas irreführend; der Inhalt bezieht sich nicht auf das canon-backend, sondern auf das genesys-backend, das z.B. für Canon-LiDE-Scanner verwendet wird.

Weitere Anpassungen für selbsterstellte Versionen

Für eine aus dem Sourcecode erstellte Version wird keine eigene dll.conf etc. angelegt (die Version aus den Quellen kopiert/verknüpft beim Installieren von sich aus die Dateien aus /etc/sane.d nach /etc/scanbd). Deswegen kopiert man (Rootrechte nötig) den Ordner /etc/sane.d/ als Unterordner nach /usr/local/etc/scanbd/ (den von checkinstall verwendeten Ort der Installation). Hier dann in der Datei /usr/local/etc/scandb/sane.d/dll.conf den net-Eintrag auskommentieren/löschen und nur die sonst verwendeten backends stehen lassen.

Zudem müssen in den Dateien /lib/systemd/system/scanbm@.service und.../scanbd.service die Pfade für die Einträge für ExecStart und Environment folgendermaßen angepasst werden:

ExecStart=/usr/local/sbin/scanbm -c /usr/local/etc/scanbd/scanbd.conf #scanbm@.service

bzw.

ExecStart=/usr/local/sbin/scanbd -f -c /usr/local/etc/scanbd/scanbd.conf #scanbd.service
...
Environment=SANE_CONFIG_DIR=/usr/local/etc/scanbd/sane.d #beide Dateien

In der /usr/local/etc/scanbd/scanbd.conf den Pfad in der Angabe zu saned_env = { "SANE_CONFIG_DIR...} ebenfalls auf /usr/local/etc/scanbd/sane.d setzen.

Daemon starten

Bevor der Dienst gestartet wird muss sichergestellt werden, dass saned nicht aktiv ist (sudo systemctl stop saned.socket) Es ist nicht möglich, saned mit scanbm.socket gleichzeitig zu verwenden, sie schließen sich gegenseitig aus.

Der Start des saned-Dienstes muss vorher mit dem Befehl

sudo systemctl disable saned.socket 

dauerhaft unterbunden werden.

Mit folgenden Befehlen wird der scanbd/scanbm-Dienst initiiert und gestartet

sudo systemctl enable scanbd.service # zur automatischen Ausführung beim Systemstart nötig
sudo systemctl start scanbd.service
sudo systemctl enable scanbm.socket # zur automatischen Ausführung beim Systemstart nötig
sudo systemctl start scanbm.socket 

Falls es dabei zu einer Fehlermeldung kommt, läuft evtl. saned im Hintergrund ('sudo ps -aux | grep saned') und muss ggf. beendet werden.

Hinweis:

Falls der Start von scanbm.socket fehlschlägt und 'sudo systemctl status scanbm.socket' als Ursache 'Port belegt' liefert ('scanbm.socket: Failed to listen on sockets: Address already in use'), empfiehlt es sich zu prüfen, wodurch der Port belegt wird:

ss -anp|grep 6566 

Antwort z.B.:

tcp    LISTEN     0      128       *:6566                  *:*                   users:(("inetd",pid=569,fd=7))

Ggf. den entsprechenden Dienst oder Prozess beenden - hier:

sudo systemctl stop inetd.service
sudo systemctl disable inetd.service 

und scanbm.socket erneut starten ('sudo systemctl start scanbm.socket').

Tasten mit Funktionen belegen

Um die Tasten dann mit Funktionen wie Scannen, Fotokopie erstellen, Email etc. zu belegen, in der scanbd.conf die Einträge, die im Auslieferungszustand auf test.script verweisen, entsprechend anpassen In (...)/etc/scanbd(/scripts) bzw. /usr/share/scanbd/scripts/ finden sich Vorlagen, die den eigenen Bedingungen angepasst werden können.

Bei Rechteproblemen kann es hilfreich sein sein, die zu verwendenden Skripte in einen Ordner im Homeverzeichnis zu verlegen legen, dazu dann die Angabe zum Skriptspeicherort (Standard /etc/scanbd/scripts) entsprechend anpassen.

Hinweis:

Um unter einer Version, die die scanbuttond-Backends verwendet, GUI-Programme einzusetzen, die von den Skripten aufgerufen werden, muss ggf. der Zugriff für den root-Benutzer auf den XServer ermöglicht werden. Das kann für die laufende Sitzung mit dem Befehl

xhost +si:localuser:root 

geschehen. Um das dauerhaft zu ermöglichen, müsste der Befehl in den Autostart aufgenommen werden.

Ein Skript zur Erstellung eines PDFs mit Texterkennung via OCRmyPDF könnte so aussehen:

1
2
3
4
5
6
scanimage --format tiff --mode Gray --resolution 300 -l 0 -t 0 -x 210mm -y 297mm > /home/BENUTZER/scanbd.tiff#scannt das Bild ein und speichert es als tiff (hier in Graustufen und Auflösung 300dpi)

tiff2pdf -o /home/BENUTZER/scanbd.pdf /home/BENUTZER/scanbd.tiff # eingescanntes Bild wird in Pdf umgewandelt und an ocrmypdf übergeben
export LANG=C.UTF-8
export LC_ALL=C.UTF-8
ocrmypdf -q --pdf-renderer hocr -l deu /home/BENUTZER/scanbd.pdf /home/BENUTZER/scanbdhocr.OCR.pdf

Weitere Informationen und Beispiele zu derartigen Skripten finden sich im Artikel scanbuttond (Abschnitt „Skript-Beispiele“).

Die Durchführung der Skripte startet bei Verwendung der Version aus den Quellen ggf. mit einer erheblichen Zeitverzögerung (bis zu 30 Sekunden), also etwas Geduld haben, eine selbsterstellte Version startet wesentlich schneller. Im Terminal kann in der Ausgabe von

systemctl status scanbd.service 

überprüft werden, ob der Befehl umgesetzt wir, oder es ggf. zu Fehlern bei der Abarbeitung des Skriptes kommt - ggf. zunächst keine "Quiet"-Einstellungen bei den Programmen verwenden, die Meldungen werden dann mit angezeigt.

Probleme und Lösungen

Auf dem Server ist kein Zugriff auf den Scanner mehr möglich

Grundsätzlich lässt sich der Service starten, eine Überprüfung liefert folgendes Ergebnis:

systemctl status scanbd.service 

● scanbd.service - Scanner button polling Service
   Loaded: loaded (/lib/systemd/system/scanbd.service; enabled; vendor preset: enabled)
   Active: active (running) since Do 2018-03-29 18:52:55 CEST; 57s ago
 Main PID: 5428 (scanbd)
   CGroup: /system.slice/scanbd.service
           └─5428 /usr/sbin/scanbd -f

Mär 29 18:52:55 Rechenername systemd[1]: Started Scanner button polling Service.
Mär 29 18:52:55 Rechenername scanbd[5428]: /usr/sbin/scanbd: dbus match type='signal',interface='org.freedesk

Allerdings funktioniert das "Umschalten" per scanbm nicht, zwar liefert während des Aufrufs von externen Programmen

systemctl status scanbm.socket 

eine Ausgabe in der Art

● scanbm.socket - scanbd/saned incoming socket
   Loaded: loaded (/lib/systemd/system/scanbm.socket; enabled; vendor preset: enabled)
   Active: active (listening) since Do 2018-03-29 18:53:15 CEST; 12min ago
   Listen: [::]:6566 (Stream)
 Accepted: 25; Connected: 1

Mär 29 18:53:15 Rechenername systemd[1]: Listening on scanbd/saned incoming socket.

In der Systemüberwachung wird auch eine gestartete saned-Instanz angezeigt, der Aufruf von

systemctl status scanbm@*.service 

liefert zwar etwas wie

● scanbm@3-127.0.0.1:6566-127.0.0.1:53122.service - Scanner Service (127.0.0.1:53122)
   Loaded: loaded (/lib/systemd/system/scanbm@.service; static; vendor preset: enabled)
   Active: active (running) since Sun 2019-04-28 08:58:34 CEST; 37s ago
 Main PID: 6435 (scanbm)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/system-scanbm.slice/scanbm@3-127.0.0.1:6566-127.0.0.1:53122.service
           ├─6435 /usr/local/sbin/scanbm -c /usr/local/etc/scanbd/scanbd.conf
           └─6436 saned

Apr 28 08:58:34 RECHNERNAME systemd[1]: Started Scanner Service (127.0.0.1:53122).
Apr 28 08:58:34 RECHNERNAME scanbm[6435]: /usr/local/sbin/scanbm: dbus match type='signal',interface='org.freedesktop.
Apr 28 08:58:34 RECHNERNAME saned[6436]: saned (AF-indep+IPv6) from sane-backends 1.0.27git starting up
Apr 28 08:58:34 RECHNERNAME saned[6436]: check_host: access by remote host: ::ffff:127.0.0.1
Apr 28 08:58:34 RECHNERNAME saned[6436]: init: access granted to BENUTZER@::ffff:127.0.0.1

Programme wie XSane, Simple-Scan oder scanimage erkennen den Scanner allerdings nicht und liefern Fehlermeldungen in der Art, dass das Gerät besetzt sei. Das net-Backend kann also auf dem Server nicht "extern" angesprochen werden werden.

Sleep-Skript

Als Lösung kann ein Sleep-Skript zum Einsatz kommen, für das allerdings eine Taste des Scanners verwendet werden muss. Durch den Aufruf wird das Polling zunächst unterbrochen (sleep 60), in der Zeit kann ein externes Programm gestartet werden, das via net-backend, welches in der Zeit zugänglich ist, auf den Scanner zugreift. Damit wird ein saned-Prozess gestartet; das Skript überprüft dann (alle 30 Sekunden, Wert ist anpassbar), ob der Prozess noch läuft. Mit Schließen des externen Programms wird auch der saned-Prozess beendet, und scanbd kann dann wieder mit dem Lauschen beginnen. Das Skript bei als sleep.script den scanbd-Skripten abspeichern und ausführbar machen und in der scanbd.conf für die gewünschte Taste als Befehl eintragen.

1
2
3
4
5
6
#!/bin/bash
sleep 60
while pidof saned true
   do
sleep 30
done

Starten eines Scanprogramms auf dem Server via Taste am Scanner

Als weitere provisorische Lösung zur Nutzung von Scanprogrammen kann auch ein Skript eingerichtet werden, das mit einer beliebigen Taste des Scanners aufgerufen werden kann. Um beispielsweise XSane zu starten, kann folgendes Skript verwendet werden:

1
2
3
4
5
#!/bin/bash
export DISPLAY=:0
export LANG=de_DE.UTF-8
export LC_ALL=de_DE.UTF-8
xsane

Die DISPLAY-Angabe ist nötig weil sonst für GUI-Programme keine Ausgabe erfolgt, mit den LANG/LC_ALL-Angaben wird die Sprache/Zeichensatz-Angabe umgestellt, auch für ggf. von XSane aus aufgerufene Programme. Allerdings kann es zu Rechte-Problemen kommen, weil ggf. Programme oder Funktionen nicht über Bash-Skripte aufgerufen werden können.

Zweiter Scanner wird nicht gefunden

Bei Verwendung der "Standard"-Version wird ggf. auch ein weiterer angeschlossener Scanner nicht gefunden, bzw. vom Scanprogramm als "besetzt" ("Decive Busy" o.ä.) angezeigt. Abhilfe schafft auch hier die Verwendung des Sleep-Skripts, dann kann bei Aufruf der Programme der gewünschte Scanner mit angegeben/ausgewählt werden.

Falscher Scanner startet bei Verwendung der scanbuttond-backends

Bei Verwendung eines Scanners, der über die scanbuttond-backends läuft, kann es passieren, dass ein zweiter angeschlossener Scanner (zumindest wenn er über dasselbe sane-backend läuft - aufgetreten bei zwei Scannern, die beide das genesys-backend benötigen) bei Tastendruck vom ersten Scanner aus verwendet wird. Abhilfe schafft hier, in den Skripten beim Aufruf von Scanprogrammen expizit das zu verwendende Device des über das scanbuttond-backend aufzurufenden Scanners einzutragen (also etwas wie scanimage -d net:localhost:genesys:libusb:003:006 OPTIONEN).

HP-Drucker gestört

Der Einsatz von scanbd kann die Funktion von HP-Druckern behindern.

Alternativen

Diese Revision wurde am 22. Juni 2021 16:17 von peter_s erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Büro, Scanner, Grafik, Netzwerk