2009-05-07 6 views
17

Ich benutze eine Java-App, die eine visuelle Anzeige von einigen der Dinge erstellt, die es macht, während es es macht. Ich möchte dies jedoch in einem Skript ausführen, das keine Anzeige zum Anhängen enthält. In der aktuellen Umgebung ist nicht einmal eine DISPLAY-Umgebungsvariable festgelegt. Ich habe versucht, mein DISPLAY einfach auf: 0.0 zu stellen. Aber das existiert nicht. Das Display interessiert mich nicht wirklich. Ich möchte nur, dass die App die Dateien automatisch verarbeitet.A/dev/null Äquivalenz für DISPLAY, wenn das Display nur Rauschen ist

Da ich nicht nur das Display ausschalten kann (nicht meine App), bin ich links mit dem Versuch, die Notwendigkeit für die Anzeige zu umgehen.

Gibt es ein schwarzes Loch, an das ich das DISPLAY senden kann? ein Äquivalent zu/dev/null?

Ich suchte ein wenig im Web, aber die Worte, die ich mir vorstellen konnte zu verwenden: "display" "null" "ignorieren" usw. sind alle zwei generische um mich zu einer Antwort zu bekommen.

Dies ist die Mitte eines größeren Skripts, also möchte ich den Rest der Ausgabe stdout verfügbar sein.

Antwort

13

Es gibt einen kopflosen X-Server namens Xvfb. Es ist im Grunde, was Sie brauchen, da es X-Clients akzeptiert, aber im Grunde nichts mit den Daten von ihnen tut. Von dieser Seite verlinkt sind (leicht paraphrasiert):

Xvfb, die X virtuellen Framebuffer, ist ein Display-Server das X11-Display-Server-Protokoll implementiert.

Im Gegensatz zu anderen Anzeige-Servern führt Xvfb alle grafischen Operationen im Speicher aus, ohne dass eine Bildschirmausgabe angezeigt wird.

Aus der Sicht des Clients verhält es sich genau wie jeder andere X-Display-Server, bedient Anfragen und sendet gegebenenfalls Ereignisse und Fehler. Es wird jedoch keine Ausgabe angezeigt.

Dieser virtuelle Server erfordert nicht, dass der Computer, auf dem er ausgeführt wird, über einen Bildschirm oder ein Eingabegerät verfügt. Nur eine Netzwerkschicht ist notwendig.

Wenn Sie das nicht finden können, wäre eine andere Möglichkeit, einen Ersatz-PC mit einer vollständigen CygWin-Installation zu verwenden. CygWin wird mit einem vollwertigen X-Server geliefert, mit dem Sie Ihre Anwendung verbinden können (und sie einfach ignorieren). Sie könnten es sogar als Corporate/dev/null DISPLAY einrichten.

Aber ich würde zuerst in Xvfb schauen.

+0

Das hat wirklich gut für mich funktioniert. Es ist Xvfb. Die Box gehört mir nicht, aber der Administrator war nett genug, sie auf die Box zu legen. – Marc

+0

Vielen Dank! Ich wollte schon immer gschem laufen lassen, um PDFs und PNGs meiner Schaltpläne auf meinem Build-Rechner zu erstellen, aber ohne X hat es nicht funktioniert (was ein Ärgernis ist). Jetzt mit Xvfb gibt es einen X-Server, mit dem man sich verbinden kann! – KeyserSoze

0

Können Sie eine VM auf dem Zielcomputer ausführen? Dann könnten Sie Ihr DISPLAY darauf einstellen. Oder du könntest vnc versuchen (momentan auf einer Maschine, die das nicht erlaubt oder ich würde es versuchen ...).

1

Sie können Xvfb verwenden, wie oben erwähnt. Auf diese Weise werden Sie die Ausgabe nie sehen (Sie können jedoch ein Tool verwenden, um Screenshots zu machen).

http://en.wikipedia.org/wiki/Xvfb http://packages.debian.org/sid/xvfb

Oder Sie könnten einen VNC-Server einrichten. Unter Linux ist ein VNC-Server als spezieller X-Server implementiert, auf den über VNC zugegriffen werden kann, anstatt auf einem lokalen Monitor angezeigt zu werden. Das gibt Ihnen einen kopflosen X-Server, mit dem zusätzlichen Bonus, dass Sie über VNC mit ihm verbinden können, nur für den Fall, dass Sie müssen müssen sehen, was los ist.

http://www.tightvnc.com/vncserver.1.html

vncserver ist ein schöner Wrapper-Skript für (tight) VNC, die einen VNC-Server zu einem Kinderspiel macht den Einstieg. Die meisten Distributionen sollten es standardmäßig installieren.

2

Wenn es sich um ein Java-Programm handelt, können Sie den Headless-Modus verwenden, um die Anwendung auszuführen.

Versuchen Sie es mit -Djava.awt.headless=true Parameter, wie diese ausgeführt werden, wenn es Datei ein Glas ist:

java -Djava.awt.headless=true -jar jarfile.jar

More about headless mode...

+0

Ich hatte keine Chance, dass dieser Ansatz funktioniert. Ich habe es versucht, aber trotzdem eine kopflose Ausnahme bekommen. Kein Zweifel, wenn diese kleine App richtig geschrieben wurde, hätte ich diese Flagge verwenden können. – Marc

+0

@Marc: 'java.awt.headless = true' teilt der JVM nur mit, dass keine Anzeige verfügbar ist. Einige Java-APIs können damit umgehen und weiterarbeiten, einige nicht und werfen eine "HeadlessException". Ob das funktioniert, hängt davon ab, was das Programm macht. Siehe [Verwendung des kopflosen Modus in der Java SE-Plattform] (http://www.oracle.com/technetwork/articles/javase/headless-136834.html) (von Artem Ananiev und Alla Redko, Juni 2006) für Details. – sleske

0

Kurze Antwort, Verwendung:

xvfb-run JAVA_COMMAND_LINE 

auf Ihrer Version Je und Geschmack von Linux, möglicherweise gibt es one line you have to change in xvfb-run, um alles zum Laufen zu bekommen.