J'expose le contexte : je veux executer une commande, récupérer le contenu, et mettre à jour une base de données.
Distrib : Fedora Core 6, en ssh.
Java : java version "1.4.2" gij (GNU libgcj) version 4.1.1 20070105 (Red Hat 4.1.1-51) - jrefactory 2.8.6-9
script :
package conso;
import java.sql.*;
import java.io.*;
/**
* @author Yami
*/
public class Main {
static Main conso = null;
dbconnect db = new dbconnect();
String driver = dbconnect.getDriver();
String host = dbconnect.getHost();
String user = dbconnect.getUser();
String pass = dbconnect.getPassword();
Connection conn = null; Statement st = null; ResultSet rs = null;
String id = new String();
String ip = new String();
String port = new String();
String cmd = new String();
String result = new String();
public Main() {
//séléction des serveurs
try {
Class.forName(driver);
conn = DriverManager.getConnection(host, user, pass);
st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = st.executeQuery("SELECT ....");
rs.first();
do {
//execution de la commande
id = rs.getString("id");
cmd = "ps ax -o\"%C %z %a\" |grep hlds_i686 |grep " + rs.getString("ip") + " |grep " + rs.getString("port") + " |grep -v grep";
try {
Runtime r = Runtime.getRuntime();
Process p = r.exec(cmd);
String s =null;
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuffer buffer = new StringBuffer();
while ((s = reader.readLine()) != null) {
buffer.append(s);
}
result = buffer.toString();
}catch(Exception e) {System.out.println("erreur d'execution " + cmd + e.toString());}
//Mise en place du résultat dans un tableau sans espaces
String[] array = result.split(" ");
st.execute("INSERT ...");
}while(rs.next());
}
catch (ClassNotFoundException ex) { System.out.println("Erreur Driver"); }
catch(SQLException s) {System.out.println("Erreur SQL : "+s.getErrorCode()+" "+s.getMessage());
}
}
et voilà, après un javac Main.java dbconnect.java , le problème se situe à l'execution : java Main.java
j'ai cette erreur :
java Main.java dbconnect.java
Exception in thread "main" java.lang.NoClassDefFoundError: Main.java
at gnu.java.lang.MainThread.run(libgcj.so.7rh)
Caused by: java.lang.ClassNotFoundException: Main.java not found in gnu.gcj.runt ime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoade r{urls=[], parent=null}}
at java.net.URLClassLoader.findClass(libgcj.so.7rh)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at java.lang.ClassLoader.loadClass(libgcj.so.7rh)
at gnu.java.lang.MainThread.run(libgcj.so.7rh)
Je désepères, aucune de mes recherches n'a abouti peut-être que quelqu'un aurait une idée.
Et au passage, ca n'a rien à voir avec Java, mais si quelqu'un connait la commande unix permettant d'afficher la bande passante utilisée par un processus.
# .
Posté par Toto . Évalué à 3.
- je ne vois pas de méthode main : public static void main (String args) : prototype obligatoire de la fonction main
- la commande java prend en argument le nom de la classe principale contenant la méthode main. Dans ton cas, tu devrais dire java Main (sans l'extension .class)
[^] # Re: .
Posté par Yami . Évalué à 0.
- ca change rien.
[^] # Re: .
Posté par Toto . Évalué à 3.
[^] # Re: .
Posté par Obsidian . Évalué à 4.
[^] # Re: .
Posté par Yami . Évalué à -1.
# Hum
Posté par Calim' Héros (site web personnel) . Évalué à 2.
L* p******* v*** d* l* j**, e*** d*** ê*** m** c*********.
J* t* c****** d'a**** v** à c**** a****** : h***://j***.s**.c**/j*****/6/d***/a**/i****.h***
[^] # Re: Hum
Posté par Yami . Évalué à 0.
[^] # Re: Hum
Posté par Calim' Héros (site web personnel) . Évalué à 2.
# Bon
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 2.
doit avoir un lien avec le 'package conso' en tout début qui cree un
namespace et donc rend la classe Main inaccessible en tant que tel.
Autre chose ta commande est optimisable (un peu):
cmd = "ps ax -o\"%C %z %a\" |grep [h]lds_i686 |grep " + rs.getString("ip") + " |grep " + rs.getString("port");
Quand à la bande passante utilisée par processus, comment dire... le kernel ne garde pas cette information c'est donc à toi de la calculer en passant l'interface en promiscuous et en comptant les paquets emis ou a destination du port utilise par ton processus sur un intervalle de temps.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.