Linux: Bash von Java aus aufrufen

Status
Nicht offen für weitere Antworten.
B

Beni

Gast
Hallo

Ich muss von Java aus bash in Ubuntu aufrufen. Damit die Environment-Variablen verfügbar sind (das Zeugs das in .bashrc, .profile, etc geladen wird) muss es eine interaktive-login-shell (?) sein.

Jetzt bekomme ich aber immer einen seltsame Fehlermeldung: "bash: no job control in this shell". Danach läuft zwar alles wie es soll, und die "job control" (würde Dinge wie "ctrl+Z" um einen Job zu versenken erlauben) wird auch garnicht benötigt. Aber mich (und mindestens einen Benutzer) stört diese Meldung.

Ich könnte die Meldung einfach in der Anzeige rausfiltern, aber lieber wüsste ich wie ich sie ganz loswerde... Dr. Google konnte mir zwar sagen was die Meldung bedeutet, aber nicht wie ich sie loswerde.

Jede Hilfe ist willkommen ;)

Das Program unten erzeugt das Problem, bei mir ist seine Ausgabe:
Code:
bash: no job control in this shell
kuckuck
besigg@pc-10130:~/workspace/TOS Spielwiese$ besigg@pc-10130:~/workspace/TOS Spielwiese$ logout
exit: 0
[highlight=Java]package tos_spielwiese;

import java.io.IOException;
import java.io.InputStream;
import java.io.InterruptedIOException;
import java.io_OutputStream;
import java.io.PrintWriter;

public class NoJobControl{
public static void main( String[] args ) throws Exception{
ProcessBuilder pb = new ProcessBuilder( "bash", "-l", "-i" );

Process p = pb.start();

StreamGobbler errorGobbler = new StreamGobbler( p.getErrorStream(), System.err );
StreamGobbler outputGobbler = new StreamGobbler( p.getInputStream(), System.out );

errorGobbler.setPartner( outputGobbler );
outputGobbler.setPartner( errorGobbler );

errorGobbler.start();
outputGobbler.start();

PrintWriter writer = new PrintWriter( p.getOutputStream() );

writer.print( "echo kuckuck" );
writer.print( "\n" );

writer.print( "exit" );
writer.print( "\n" );
writer.flush();

int exitValue = p.waitFor();

outputGobbler.join();
errorGobbler.join();

System.out.println( "exit: " + exitValue );
}

/*
*
* Der restliche Code ab hier transferiert lediglich die Ausgabe der
* shell zu System.err/out.
*
*/


/**
* Used to elect a leader when two gobblers try to process their stream
* at the same time. The winner processes its stream first, afterwards
* the looser processes its stream. Leadership can change whenever a
* gobbler blocks.
*/
private static class Leader{
private int time;

public synchronized int time(){
time++;
return time;
}
}

private static class StreamGobbler{
private InputStream input;
private OutputStream output;

boolean usePrintStream = false;

private Running running = new Running();
private Thread thread;

private StreamGobbler partner;
private Leader leader;

public StreamGobbler( InputStream input, OutputStream output ){
this.input = input;
this.output = output;
}

/**
* Sets the partner of this gobble, this gobbler will not process its
* {@link InputStream} at the same time when its partner is reading.
* @param partner the partner
*/
public void setPartner( StreamGobbler partner ){
this.partner = partner;
leader = partner.leader;
if( leader == null ){
leader = new Leader();
}
}

protected void setInput( InputStream input ){
this.input = input;
}

protected void setOutput( OutputStream output ){
this.output = output;
}

public synchronized void start(){
if( thread != null && thread.isInterrupted() )
thread = null;

if( thread == null ){
thread = new Thread( running );
thread.start();
}
}

public synchronized void stop(){
if( thread != null ){
thread.interrupt();
}
}

public void join(){
Thread thread = this.thread;
if( thread != null ){
while( thread.isAlive() ){
try{
thread.join();
}
catch ( InterruptedException e ){
e.printStackTrace();
}
}
}
}

/**
* Called every time when a new byte was transmitted. The default implementation
* does do nothing.
* @param value the byte that was transmitted or -1
*/
protected void piped( int value ){
// nothing
}

/**
* Tells whether this gobble is currently processing input from its
* {@link InputStream}.
* @return <code>true</code> if this gobbler is neither waiting for input
* nor stopped.
*/
public synchronized boolean isReading(){
if( thread == null )
return false;

return running.reading;
}

private class Running implements Runnable{
private volatile boolean reading = true;
private volatile int time = 0;

public void run(){
try {
if( leader != null ){
time = leader.time();
}

while( !Thread.interrupted() ){
int next = 0;

if( input.available() > 0 ){
next = input.read();
}
else{
reading = false;
next = input.read();
if( leader != null ){
time = leader.time();
}
reading = true;
}

if( partner != null ){
while( partner.isReading() && time > partner.running.time ){
Thread.yield();
}
}

if( next == -1 ){
piped( next );
synchronized( StreamGobbler.this ){
thread = null;
}
return;
}

if( output != null ){
output.write( next );
}
piped( next );
}
}
catch( InterruptedIOException ex ){
// ignore
}
catch( IOException ioe ){
ioe.printStackTrace();
}
}
}
}
}
[/highlight]
 
B

bygones

Gast
für was brauchst du die konsole ?

rufst du dann ein weiteres Programm auf ?

und warum stört die ausgabe ?


ins blaue mal rein...

a) entweder rufst du das programm was du nutzen willst direkt auf
b) schreib dir ein bash script was die befehle bündelt und rufe das über java dann auf....

Gruß
dbc
 
B

Beni

Gast
Mein Programm baut auf anderen, existierenden Tools auf. Der sog. TinyOS-Tool-Chain. Für diese Tool-Chain wird empfohlen, dass man .bashrc modifiziert um sie zum laufen zu bringen. Mit der Modifikation werden verschiedene Pfade als Variablen abgelegt. Grundsätzlich ist TinyOS immer mit viel Gebastel verbunden. Das einzige wobei ich mir sicher sein kann, ist dass die Tool-Chain funktioniert wenn man direkt was in die Konsole eingibt.

Ich benötige bash nun für zwei Dinge:
1. um Pfade zu finden (mit "echo $VARIABLE"). Diese Variablen sind leider nicht in der Map von System.getenv zu finden.
2. Um "make" und eine Variante des "gcc" aufzurufen. Die Dinger hängen wieder von diesen Pfaden ab. Die Ausgabe von make und gcc interessiert den Benutzer, da hier einige wichtige Fehler angezeigt werden könnten... (wenn da gross rot steht, dass irgendwas mit "job" kaputt ist, dürfte der ein oder andere erschrecken)

a) fällt damit wohl aus

b) was ich jetzt mache ist ja schon ziemlich ähnlich wie ein Script, und ein Script müsste man doch auch wieder mit bash aufrufen... was dann beim selben Problem endet?

thx Beni
 
Zuletzt bearbeitet von einem Moderator:

Ebenius

Top Contributor
Meine man-Page zu bash behauptet hierzu:
When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

Das heißt, Du müsstest Zeile 11 austauschen gegen: [HIGHLIGHT="Java"]ProcessBuilder pb = new ProcessBuilder( "bash", "--login" );[/HIGHLIGHT]

HTH, Ebenius
 
B

Beni

Gast
Ohne "-i" werden die .bashrc-Dateien nicht geladen, dann fehlen wieder die Pfade.

(ich kann nichtmal --rcfile verwenden weil irgendein D*pp diese Variablen sicherlich aus seiner persoenlichen Spezialdatei laedt).
 
Zuletzt bearbeitet von einem Moderator:

HoaX

Top Contributor
Kannst ja die Dateien von Hand "nachladen":
Code:
source $HOME/.bashrc usw
oder
Code:
. $HOME/bash
usw
 

Ebenius

Top Contributor
Ohne "-i" werden die .bashrc-Dateien nicht geladen, dann fehlen wieder die Pfade.

(ich kann nichtmal --rcfile verwenden weil irgendein D*pp diese Variablen sicherlich aus seiner persoenlichen Spezialdatei laedt).
Was sagt denn die man-Page in Deiner Umgebung dazu? Laut dem Zitat oben würde ich davon ausgehen, dass ...
Code:
bash --login
... genügt.

Ebenius
 
B

Beni

Gast
@HoaX
Die Idee ist gut, aber wie kann ich sicher sein, dass das auch in Zukunft und auf anderen Systemen funktioniert? :-/

@Ebenius

Laut man:
When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file
/etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes com‐
mands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may
be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.
Wenn ich alle Kombinationen ausprobiere, wird deutlich, dass "-i" immer zum lesen von bashrc führt (das widerspricht dem manual? Vielleicht ein zusaetzliches Script das noch irgendwo versteckt ist.). Im Code unten wurde jeweils "echo $TOSROOT" ausgeführt, was einen Pfad ausgibt der in bashrc definiert ist.

Code:
>>>>> bash

exit: 0
<<<<<
>>>>> bash --login

exit: 0
<<<<<
>>>>> bash -i
bash: no job control in this shell
/opt/tinyos-2.1.0
besigg@pc-10130:~/workspace/TOS Spielwiese$ besigg@pc-10130:~/workspace/TOS Spielwiese$ exit
exit: 0
<<<<<
>>>>> bash --login -i
bash: no job control in this shell
/opt/tinyos-2.1.0
besigg@pc-10130:~/workspace/TOS Spielwiese$ besigg@pc-10130:~/workspace/TOS Spielwiese$ logout
exit: 0
<<<<<
[highlight="Java"]
public static void main( String[] args ) throws Exception{
test( "bash" );
test( "bash", "--login" );
test( "bash", "-i" );
test( "bash", "--login", "-i" );
}

private static void test( String... command ) throws Exception{
System.out.print( ">>>>>" );
for( String cmd : command ){
System.out.print( " " );
System.out.print( cmd );
}
System.out.println();

ProcessBuilder pb = new ProcessBuilder( command );
Process p = pb.start();

StreamGobbler errorGobbler = new StreamGobbler( p.getErrorStream(), System.err );
StreamGobbler outputGobbler = new StreamGobbler( p.getInputStream(), System.out );

errorGobbler.setPartner( outputGobbler );
outputGobbler.setPartner( errorGobbler );

errorGobbler.start();
outputGobbler.start();

PrintWriter writer = new PrintWriter( p.getOutputStream() );


// writer.print( "make -C /home/besigg/runtime-Yeti2/Blink3/src mica2" );
writer.print( "echo $TOSROOT" );
writer.print( "\n" );

writer.print( "exit" );
writer.print( "\n" );
writer.flush();

int exitValue = p.waitFor();

outputGobbler.join();
errorGobbler.join();

System.out.println( "exit: " + exitValue );

Thread.sleep( 1000 );
System.out.println( "<<<<<" );
}[/highlight]
 
Zuletzt bearbeitet von einem Moderator:
B

Beni

Gast
Ich glaub ich löse das Problem anders: zuerst lese ich die Variablen im Hintergrund aus, und benutz dann eine nicht-interaktive Shell um make/gcc aufzurufen (bin mir nichtmal sicher, ob ich dann noch eine Shell benötige). Die Variablen muss ich dann zwar von Hand setzen, aber da kann man die Map vom ProcessBuilder verwenden.
 
B

Beni

Gast
Wieso solltest du dir nicht sicher sein? Die Namen der Initskripte werden sich sicher nicht von heute auf morgen ändern.

Das stimmt schon, ich finde es nur immer sehr ungemütlich mich bei so einem Problem auf die Dokumentation von 3. Programmen zu verlassen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Linux bash script ausführen Allgemeine Java-Themen 16
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
M Eclipse unter Linux Lite Allgemeine Java-Themen 2
M priority scheduling in Linux Allgemeine Java-Themen 3
Killunox MaxHeap Zuweisung unter Linux funktioniert nicht Allgemeine Java-Themen 1
L Super User via Processbuilder (Linux) Allgemeine Java-Themen 3
OSchriever Linux-Programm öffnen Allgemeine Java-Themen 6
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
J ASCM - In Linux öffnen Allgemeine Java-Themen 3
L Tesseract-OCR 4.0 unter Linux funktioniert nicht Allgemeine Java-Themen 3
J Sound mit Clip in Linux abspielen Allgemeine Java-Themen 3
K USB infos unter Linux abfragen? Allgemeine Java-Themen 2
N Lizenzensierung von Java Programmen unter Linux Allgemeine Java-Themen 3
P OneWire Java Linux Allgemeine Java-Themen 11
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
C Windows RCP Application unter Linux bauen lassen Allgemeine Java-Themen 3
D jnativehook auf Linux Allgemeine Java-Themen 1
A Linux: Native Library mit Rootrechten ohne Prozess mit sudo zu starten Allgemeine Java-Themen 1
F Linux & NetBeans: Datei in Systemverzeichnis schreiben? Allgemeine Java-Themen 1
E Sonderzeichen nicht setzbar: Großes Problem bei Programmierung unter Linux Mint mit Virtual Box Allgemeine Java-Themen 5
F URI Schema in Linux erstellen? Allgemeine Java-Themen 3
D Problem VLC4J Raspbian(Linux) Allgemeine Java-Themen 0
M Code läuft unter windows aber nicht unter Linux Allgemeine Java-Themen 6
F.S.WhiTeY JDK installieren Linux: Nach Update link auf Java zerschossen Allgemeine Java-Themen 4
M Java auf Linux und Windows Allgemeine Java-Themen 6
D pfad zur jre linux Allgemeine Java-Themen 8
B Ordner öffnen mittels Java in Linux-Umgebung Allgemeine Java-Themen 7
P Eclipse Unter Windows erstelle .jar unter Linux (Ubuntu) funktioniert nicht Allgemeine Java-Themen 5
G Linux/C++/Pthreads auf JVM zugreifen, thread safe? Allgemeine Java-Themen 10
G Runtime.exec beendet Programm unter Linux, wenn Java Programm beendet wird Allgemeine Java-Themen 3
G RXTX native library unter Linux in jar build angeben Allgemeine Java-Themen 4
R Umlautproblem unter Linux Allgemeine Java-Themen 10
Gossi Mit Java auf Linux- & Windowssysteme zugreifen? Allgemeine Java-Themen 4
T Jar File läuft unter Windows aber nicht unter linux Allgemeine Java-Themen 10
Z Probleme bei Stringvergleichen (Windows/Linux) Allgemeine Java-Themen 10
M Linux Rechner per ssh runterfahren mit Java Allgemeine Java-Themen 8
F Process.getInputStream unter Linux Allgemeine Java-Themen 7
J Java programm lässt sich in win7 nach linux install nicht mehr ausführen Allgemeine Java-Themen 18
G Input/Output URLDecoder.decode - Unterschiedliche Ergebnisse Windows / Linux Allgemeine Java-Themen 2
G Java und Syslog (Linux) Allgemeine Java-Themen 3
T Javaprogramm unter Linux auf bestimmten Kern starten/laufen lassen ? Allgemeine Java-Themen 22
D Unix/Linux Benutzer-Authentifikation über Java Allgemeine Java-Themen 3
B JNA, Linux und die Smart Card Allgemeine Java-Themen 2
P Runnable Jar File über Windows ausführbar doch über Linux nicht Allgemeine Java-Themen 8
C RXTX Treiber einbinden für Linux Allgemeine Java-Themen 6
C Datei auslesen wie unter Linux mit "tail -f" Allgemeine Java-Themen 3
E Linux Cups Allgemeine Java-Themen 6
S Verhalten von System.getenv() in Ubuntu / Linux Allgemeine Java-Themen 12
T linux problem mit Desktop.getDesktop().open(..) Allgemeine Java-Themen 5
lordcarlos Runtime exec und mplayer (linux) Allgemeine Java-Themen 11
J dialogys unter linux Allgemeine Java-Themen 4
S Problem beim Drucken auf Netzwerkdrucker unter Linux Allgemeine Java-Themen 9
T System Preferences + LInux (Ubuntu) Allgemeine Java-Themen 8
R Timing-Problem (?) Linux versus Windows Allgemeine Java-Themen 13
F Document öffnen unter Linux Allgemeine Java-Themen 4
F Portzugriffe Java @Linux & Windows? Allgemeine Java-Themen 4
W Deployment unter Linux Allgemeine Java-Themen 17
D Mit Linux mehrere Kommandos in einem Subprozeß Allgemeine Java-Themen 3
E Erfahrung mit RXTX sowie Windows und Linux Allgemeine Java-Themen 9
J Externes Programm starten und stoppen (Linux) Allgemeine Java-Themen 3
B Programm läuft unter Linux, aber nicht unter Windows Allgemeine Java-Themen 3
J UTF-8 Sockets : Windows<->Linux Ein altes Problem Allgemeine Java-Themen 7
S Ausführbare Scriptdatei unter Linux erstellen Allgemeine Java-Themen 6
J Programm unter Linux starten Allgemeine Java-Themen 3
R Jar-File vom Linux Desktop durch ancklicken starten? Allgemeine Java-Themen 5
P Linux port Allgemeine Java-Themen 4
P CLASSPATH LINUX Allgemeine Java-Themen 9
L Programm läßt sich wegen Java unter Linux nicht starten Allgemeine Java-Themen 4
V JAR-File läuft unter Windows und Linux, aber nicht unter OSX Allgemeine Java-Themen 6
M Welches Linux zum Java testen? Allgemeine Java-Themen 5
D linux shell aus java öffnen Allgemeine Java-Themen 5
A Linux-Consolenbefehle über Java ausführen? Allgemeine Java-Themen 2
B Java Applikation incl. dll unter Linux ausführen? Allgemeine Java-Themen 11
G Java Socket langsam unter Linux Allgemeine Java-Themen 21
T *.jar applikationen auf Linux installieren Allgemeine Java-Themen 4
P jdic/Linux Allgemeine Java-Themen 2
G Linux Dateinamen Charset Probleme Allgemeine Java-Themen 8
Ark Linux: Shell-Skript zum Kompileren und Starten Allgemeine Java-Themen 4
N Linux-Commands über Java Anwendung ausführen Allgemeine Java-Themen 12
M Eigenes Java-Server-Programm unter Linux steuern? Allgemeine Java-Themen 13
P linux + java :/ Allgemeine Java-Themen 11
G Läuft nicht unter Linux oO Allgemeine Java-Themen 10
S Java Entwicklungsumgebungen unter XP und Linux und weitere F Allgemeine Java-Themen 7
W Programm starten unter Linux Allgemeine Java-Themen 10
M Speicherverwaltung unter Linux Allgemeine Java-Themen 7
A Geschwindigkeit Java unter Linux Allgemeine Java-Themen 9
J jdic funktioniert unter Linux nicht Allgemeine Java-Themen 18
S Welche Javaversion ist in meinem Linux? Allgemeine Java-Themen 2
L Native Threads unter Linux? Allgemeine Java-Themen 2
V JVM OutofMemory Linux geht, windows nicht Allgemeine Java-Themen 3
L mit exec() befehl ausführen ( OS X / Linux) Allgemeine Java-Themen 8
B JMF -> Webcam (Linux) Allgemeine Java-Themen 14
B Java 6 unter Ubuntu (Linux) Allgemeine Java-Themen 4
B gibVerzeichnis() unter linux Allgemeine Java-Themen 9
D JMF unter Linux/Windows, nichts funktioniert Allgemeine Java-Themen 3
F Runtime.getRuntime().exec mit Linux und Leerzeichen Allgemeine Java-Themen 3
L javax.comm unter Linux Allgemeine Java-Themen 11
G Zugriff von Windows auf Linux Allgemeine Java-Themen 11
M Wie mit Dateipfaden zwischen Linux und WIndows hantieren? Allgemeine Java-Themen 2

Ähnliche Java Themen


Oben