2009-05-07 7 views
17

Sto eseguendo un'applicazione java che crea una visualizzazione visiva di alcune delle cose che sta facendo, mentre lo sta facendo. Tuttavia, voglio eseguirlo in uno script che non avrà uno schermo a cui collegarsi. Nell'ambiente attuale, non è impostata alcuna variabile di ambiente DISPLAY. Ho provato a impostare semplicemente il mio DISPLAY su: 0.0. Ma questo non esiste. Non mi interessa davvero il display. Voglio solo che l'app elabori i file in silenzio.Un/dev/null equivilent per DISPLAY quando il display è solo rumore

Dal momento che non posso spegnere il display (non la mia app), mi rimane il tentativo di aggirare il bisogno di visualizzazione.

C'è un buco nero a cui posso inviare il DISPLAY? un equivalente a/dev/null?

Ho cercato un po 'sul web, ma le parole che potevo pensare di usare: "display" "null" "disregard" ecc. Sono tutte due generiche per farmi dare una risposta.

Questo è il centro di uno script più grande, quindi voglio che il resto dell'output su stdout sia disponibile.

risposta

13

C'è un server X senza testa chiamato Xvfb. Fondamentalmente è ciò di cui hai bisogno dal momento che accetta i client X, ma fondamentalmente non fa nulla con i dati da loro. Da quella pagina collegata (un po 'parafrasato):

Xvfb, il framebuffer virtuale di X, è un server di visualizzazione attuazione del protocollo del server di visualizzazione X11.

In contrasto con altri server di visualizzazione, Xvfb esegue tutte le operazioni grafiche in memoria senza visualizzare alcuna uscita schermo.

Dal punto di vista del client, agisce esattamente come qualsiasi altro server di visualizzazione X, servendo richieste e inviando eventi ed errori a seconda dei casi. Tuttavia, non viene mostrato alcun output.

Questo server virtuale non richiede che il computer su cui è in esecuzione disponga di uno schermo o di qualsiasi dispositivo di input. È necessario solo un livello di rete.

Se non riesci a trovarlo, allora un'altra possibilità sarebbe quella di utilizzare un PC di riserva con un'installazione CygWin completa. CygWin viene fornito con un server X in piena regola al quale è possibile connettere l'applicazione (e ignorarla). Potresti anche configurarlo come DISPLAY aziendale/dev/null.

Ma guarderei prima Xvfb.

+0

Questo ha funzionato molto bene per me. È Xvfb. La scatola non è mia, ma l'amministratore è stato abbastanza gentile da metterlo sulla scatola. – Marc

+0

Grazie! Ho sempre voluto essere in grado di eseguire gschem per produrre PDF e PNG dei miei schemi sulla mia macchina di compilazione, ma non ha funzionato senza X (che è un dolore nel sedere). Ora con Xvfb c'è un server X a cui connettersi! – KeyserSoze

0

È possibile eseguire una VM sul computer di destinazione? Quindi puoi impostare il tuo DISPLAY su quello. Oppure potresti provare vnc (attualmente su una macchina che non lo consente o lo proverei ...).

1

È possibile utilizzare Xvfb, come indicato sopra. In questo modo, non vedrai mai l'output (puoi comunque utilizzare uno strumento per fare screenshot).

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

Oppure si potrebbe impostare un server VNC. Sotto Linux, un server VNC è implementato come un server X speciale a cui è possibile accedere tramite VNC, a differenza della visualizzazione su un monitor locale. Questo ti dà un X server senza testa, con il vantaggio in più che puoi connetterti tramite VNC nel caso in cui tu abbia do per vedere cosa sta succedendo.

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

vncserver è uno script wrapper piacevole per (stretto) VNC, che rende avviare un server VNC un gioco da ragazzi. La maggior parte delle distribuzioni dovrebbe installarlo di default.

2

Se si tratta di un programma java, è possibile utilizzare la modalità senza testa per eseguire l'applicazione.

provo a farlo funzionare con -Djava.awt.headless=true parametro, in questo modo se si tratta di un file jar:

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

More about headless mode...

+0

Non ho avuto la possibilità di far funzionare questo approccio. Ci ho provato, ma ho ricevuto comunque un'eccezione senza headless. Senza dubbio, se questa piccola app è stata scritta correttamente, avrei potuto usare questa bandiera. – Marc

+0

@Marc: 'java.awt.headless = true' dice semplicemente alla JVM che non è disponibile alcuna visualizzazione. Alcune API Java possono gestirle e continuare a funzionare, alcune no e lanciare 'HeadlessException'. Quindi, se funziona dipende da cosa fa il programma. Vedi [Utilizzo della modalità senza testa nella piattaforma Java SE] (http://www.oracle.com/technetwork/articles/javase/headless-136834.html) (di Artem Ananiev e Alla Redko, giugno 2006) per i dettagli. – sleske

0

Risposta breve, l'uso:

xvfb-run JAVA_COMMAND_LINE 

A seconda della versione e il sapore di Linux, ci può essere one line you have to change in xvfb-run per ottenere tutto per l'esecuzione.