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.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
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.
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
mitinclude(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¶
Tasten am Scanner verwenden - Übersicht
insaned - einfacheres Programm zum Einsatz der Scanner-Knöpfe, das allerdings auch nicht den Anspruch hat, den Scanner anderweitig zu verwenden.
bscand - ein Programm, das über eine gepatchte SANE-backend-Version die Tasten direkt zugänglich macht; SANE-Programme bleiben voll einatzfähig, verwendet dazu das net-backend.
Links¶
Scanner -Übersichtsartikel
Scanner Button Daemon 🇬🇧 - Artikel im Arch-Wiki
Anleitung mit xined 🇩🇪 aus bss.archlinux.de
Älterer Beitrag 🇬🇧, ebenfalls nicht für systemd
scanbd 🇩🇪 - Blogbeitrag auf adlerweb.info