[JAVA]Argument met whitespace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
Hallo allemaal,

Wegens verkeerd plaatsen en verkeerde omschrijving bij deze nogmaals.
Ik heb een probleem betreft mijn java source die uitgevoerd wordt door een .sh script. Mijn java source compiled zonder fouten en werkt ook gewoon prima als ik arguments zonder spatie ingeef. Op het moment dat ik een spatie gebruik in een argument dan lijkt er iets fout te gaan.

Belangrijke delen uit mijn java source:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
   public static void main(String[] args) { //Vangt arguments op die verstuurd zijn met het .sh script

         String sqlRecent = "select top 1 sj.name, sjh.step_name, sjh.run_date, sjh.run_time, sjh.run_status, sjh.message, sjh.server "
               + "from msdb.dbo.sysjobhistory sjh inner join msdb.dbo.sysjobs sj on sjh.job_id = sj.job_id "
               + "inner join msdb.dbo.sysjobsteps sjs on sj.job_id = sjs.job_id and sjh.step_id = sjs.step_id "
               + "and sj.name ='" + args[3] + "'"
               + "and sjh.run_date ='" + datequery + "'"
               + "ORDER BY run_time DESC";
         stmt = null;
         stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
               ResultSet.CONCUR_READ_ONLY);
         rsRecent = stmt.executeQuery(sqlRecent); // Argument 3 wordt toegepast, het argument met de whitespace erin.


Waar ik naar kijk in mijn java source is naar de run_status uit de MSSQL database voor argument 3.
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
while (rsRecent.next()) {
         if (rsRecent.getString("run_status").equals("0")){
            System.out.print("<a href=" + link + "/" + args[0] + "-"
                  + datetime + ".html target=main>");
            System.out.print(" CRITICAL: Job Failed" );
            System.out.print("</a>\n");
} else {
if (rsRecent.getString("run_status").equals("1")){
                     System.out.print("<a href=" + link + "/" + args[0] + "-"
                           + datetime + ".html target=main>");
                     System.out.print(" OK: Nothing Failed");
                     System.out.print("</a>\n");
                     System.out.flush();


Mijn java source returned dit weer naar het .sh script en die geeft de output weer in groundworks(monitoring systeem waar dit script voor gemaakt is). Op het moment dat een van deze 2 waardes niet returned worden naar het .sh script geeft die een status Unknown weer om aan te geven dat er iets fout zit met het script of met de MSSQL job. In dit geval ligt het aan het script, omdat als ik argument 3(de jobnaam van de mssql server) opgeef zonder whitespaces alles prima werkt.

Wat heb ik geprobeerd om het probleem op te lossen?
Ik voer mijn script op de volgende manier uit:
check_sqljob.sh -H <hostname> -u <username> -p <password> <jobname>
het .sh script verwerkt de arguments op de volgende manier:
$javacmd(/usr/java/jdk1.6.0_22/bin/java) SqlJobMon.class $2(hostname) $4(username) $6(password) $7(jobname)

Om de jobname met spaties in een argument te stoppen heb ik al op internet gelezen dat je gebruik moet maken van " " dubbele quotes om de jobname. Dit helpt inderdaad op het moment dat ik de arguments echo zie ik inderdaad dat de jobname netjes met spaties in een argument wordt weergegeven. Maar toch blijft die als ik met spaties werk de status van de job Unknown aangeven terwijl als ik de spaties van de job verwijder in mijn testdatabase hij wel gewoon werkt.


Wie o wie kan mij helpen? Zou het misschien een shell probleem kunnen zijn? De orginele java source komt van internet en was bedoeld om ALLE jobs van een mssql server te monitoren terwijl ik dit wil specificeren. De source heeft dus enkele rewrites ondergaan en dit is de enigste issue waar ik tegen aanloop en zelf geen oplossing meer voor weet.

//Edit:
Link naar java source: *snip*
Link naar .sh script: *snip*
Nogmaals, we gaan geen hele scripts van 200+ regels voor je debuggen. Post relevante informatie; mocht er meer nodig zijn dan vragen we daar wel om:
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.

[ Voor 4% gewijzigd door RobIII op 19-11-2010 10:44 ]


Acties:
  • 0 Henk 'm!

  • Spiral
  • Registratie: December 2005
  • Niet online
Wat voor IDE gebruik je? Je kan het namelijk prima debuggen in b.v. Eclipse.

Vul de gewenste parameters in plaats een debugpunt en kijk wat er gebeurt.

bv http://www.eclipse-blog.o...ments-in-eclipse-ide.html

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Java:
1
2
3
4
for ( String arg : args ) {
    System.out.println(arg);
}
System.exit(1);


Kun je de de output hiervan geven? Vervang wel even je username en password met xxxx

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:14

Janoz

Moderator Devschuur®

!litemod

OM dit probleem echt fatsoenlijk aan te pakken lijkt het me handiger wanneer je het even terugbrengt tot het bare minimum. Gewoon 1 bash scriptje met een simpele java class die enkel de argumenten opsomt. Op die manier kun je namelijk duidelijker zien op welke plek je enkele parameter plots wordt geïnterpreteerd als meerdere parameters aangezien de spatie als scheidingsteken geld.

Mijn vermoeden is namelijk dat je probleem in het geheel niet in de java code zit, maar in je bash script.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • chime
  • Registratie: Januari 2005
  • Laatst online: 06-10 16:27
Bij het ingeven van je argumenten zet je toch quotes rond degene met spaties.

Doe je dat niet dan wordt dat 1 argument natuurlijk geïnterpreteerd als x argumenten

Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
chime schreef op vrijdag 19 november 2010 @ 12:16:
Bij het ingeven van je argumenten zet je toch quotes rond degene met spaties.

Doe je dat niet dan wordt dat 1 argument natuurlijk geïnterpreteerd als x argumenten
Dat staat ook in mijn main post, maar op de een of andere manier werkt dat niet hij plaats alles wel in 1 argument alleen ik denk dat de java source het niet goed oppakt

Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
ReenL schreef op vrijdag 19 november 2010 @ 10:36:
Java:
1
2
3
4
for ( String arg : args ) {
    System.out.println(arg);
}
System.exit(1);


Kun je de de output hiervan geven? Vervang wel even je username en password met xxxx
Ik had de arguments al opgevangen via het bash script om te kijken hoe deze verstuurd worden met het volgende command:
/usr/local/groundwork/nagios/libexec/check_sqljob.sh -H <hostname> -u <username> -p <password> "JOB 1"
Output:
Unknown:
1: -H 2: <hostname> 3: -u 4: <username> 5: -p 6: <password> 7: JOB 1

En in het basscript wordt het dan weer op deze manier naar de java source gestuurd:
javacmd=/usr/java/jdk1.6.0_22/bin/java
ret=`$javacmd SqlJobMon $2 $4 $6 $7 $8`

Als ik bovenstaande code toevoeg en in unix zelf de java source uitvoer met arguments krijg ik dit terug:
[root@<servernaam> libexec]# /usr/java/jdk1.6.0_22/bin/java SqlJobMon <hostname> <username> <password> "JOB 1"
<hostname>
<username>
<password>
JOB 1

[ Voor 26% gewijzigd door Snors op 19-11-2010 12:32 ]


Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
Janoz schreef op vrijdag 19 november 2010 @ 10:37:
OM dit probleem echt fatsoenlijk aan te pakken lijkt het me handiger wanneer je het even terugbrengt tot het bare minimum. Gewoon 1 bash scriptje met een simpele java class die enkel de argumenten opsomt. Op die manier kun je namelijk duidelijker zien op welke plek je enkele parameter plots wordt geïnterpreteerd als meerdere parameters aangezien de spatie als scheidingsteken geld.

Mijn vermoeden is namelijk dat je probleem in het geheel niet in de java code zit, maar in je bash script.
Dat vermoeden heb ik ook alleen brengt me dan weer aan het twijfelen op het moment dat de arguments WEL goed aankomen in de java source. Zoals ik al zei werkt het zonder spatie als scheidingsteken prima

Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
Spiral schreef op vrijdag 19 november 2010 @ 10:31:
Wat voor IDE gebruik je? Je kan het namelijk prima debuggen in b.v. Eclipse.

Vul de gewenste parameters in plaats een debugpunt en kijk wat er gebeurt.

bv http://www.eclipse-blog.o...ments-in-eclipse-ide.html
Textpad, niet de meest gebruiksvriendelijke java editor heb eclipse ook op me laptop staan vond het allemaal een beetje ingewikkeld werken maar in eclipse zit idd een debug optie ik zal daar eens verder mee stoeien al hoop ik dat iemand hier op tweakers mij misschien ook nog een steuntje in de rug zou kunnen geven, ik begrijp namelijk da basics van java alleen met dit soort problemen schiet mijn kennis toch echt tekort.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Gebruik de edit knop ( Afbeeldingslocatie: http://tweakimg.net/g/forum/images/icons/edit.gif ) als je iets toe te voegen hebt; je topic herhaaldelijk omhoogschoppen is niet nodig en die melding staat er niet voor niets:

Afbeeldingslocatie: http://tweakers.net/ext/f/93OGDVn8zio6RrIck1qYj8ne/full.png

[ Voor 56% gewijzigd door RobIII op 19-11-2010 12:48 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
Van het weekend nog eens wat tips opgevolgd maar nog geen stap dichter bij een oplossing.
Zoals hierboven aangegeven valt dit probleem echt buiten mijn java kennis en om te voorkomen dat ik 2 maanden bezig ben met het opzoeken van een oplossing terwijl dit probleem misschien in 10 minuten opgelost zou kunnen worden omdat ik als simpele java hobbyist iets over het hoofd heb gezien.

Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
M34nM4chin3 schreef op maandag 22 november 2010 @ 02:41:
Van het weekend nog eens wat tips opgevolgd maar nog geen stap dichter bij een oplossing.
Zoals hierboven aangegeven valt dit probleem echt buiten mijn java kennis en om te voorkomen dat ik 2 maanden bezig ben met het opzoeken van een oplossing terwijl dit probleem misschien in 10 minuten opgelost zou kunnen worden omdat ik als simpele java hobbyist iets over het hoofd heb gezien.
Ga nou geen tips volgen maar ga gewoon het probleem zelf zoeken: DEBUGGEN!

Zelfs als we nu jouw probleem oplossen, dan heb je over een week of een maand weer een nieuw probleem, en wat dan? Weer een topic maken en hopen dat iemand je verder helpt? Of toch eindelijk eens leren van zelf je code te debuggen en kijken wat er fout gaat?

Het hoeft echt niet zo moeilijk te zijn. Kijk wat je erin stopt, kijk wat je eruit krijgt. Komt het niet overeen, dan zit er daar ergens een fout.

Probeer anders gewoon eens een shell scriptje dat 1 argument met spaties doorstuurt naar een simpele java class die 1 argument ontvangt, en kijk of dat goed aankomt.

Zoja, breid je code uit tot hij meer lijkt op je huidige code. Zonee, dan los je dat probleem op en pas je die oplossing toe op je huidige code.

Acties:
  • 0 Henk 'm!

  • chime
  • Registratie: Januari 2005
  • Laatst online: 06-10 16:27
Heb je de debug optie van eclipse al gebruikt? (of van je IDE)

Dan weet je exact hoe de argumenten in java binnenkomen.
Gewoon een breakpoint direct in je main methode plaatsen.

Is er dan een fout bij de argumenten, dan weet je dat het probleem aan je invoer ligt.
Zijn je argumenten toch goed, dan moet je gewoon door je code wandelen om zo het probleem op te lossen.

Maar als je zelfs als hobbyist niet goed weet hoe je moet debuggen tja ... dan ga je vaak met je kop tegen de muur oplopen.

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
[root@<servernaam> libexec]# /usr/java/jdk1.6.0_22/bin/java SqlJobMon <hostname> <username> <password> "JOB 1"
Als je dit commando direct uitvoert, doet het dan wat je verwacht (zonder mijn debug code, en met de correcte waardes).

Indien hij op de bovenstaande manier niet correct werkt ga ik ervan uit dat het probleem in java of mssql zit, probeer dan het volgende:
* De query uitprinten voordat je hem in naar de database stuurt en het programma stoppen;
* de args variable hard-coded vullen, kijken of het dan werkt.

Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
ReenL schreef op maandag 22 november 2010 @ 12:20:
[...]

Als je dit commando direct uitvoert, doet het dan wat je verwacht (zonder mijn debug code, en met de correcte waardes).

Indien hij op de bovenstaande manier niet correct werkt ga ik ervan uit dat het probleem in java of mssql zit, probeer dan het volgende:
* De query uitprinten voordat je hem in naar de database stuurt en het programma stoppen;
* de args variable hard-coded vullen, kijken of het dan werkt.
De query zelf is goed, als ik args 3 hardcode werkt het script ook perfect. Daarom vind ik het zo lastig, ik snap gewoon niet wat er precies fout gaat omdat ik de dingen hierboven al geprobeerd heb voordat ik dit topic opende. Wat het script doet is er worden een 4tal arguments ingegooid en dan wordt er weer een output verzonden naar het bash script mijn vraag is dus hoe ik dit zou kunnen debuggen. De Unknown status komt uit het bash script, samen met een OK status en CRITICAL status op basis van een $ret ik citeer uit het bash script:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if [ $argc -eq 7 ]
then
ret=`$javacmd SqlJobMon $2 $4 $6 $7`
fi
ret1=`echo $ret | grep CRITICAL| awk '{print $4}'`
if [ "$ret1" = "CRITICAL:" ]
then
echo $ret
exit 2
fi
ret2=`echo $ret | grep OK| awk '{print $4}'`
if [ "$ret2" = "OK:" ]
then
echo $ret
exit 0
else
echo "Unknown:"
echo "ret: $ret ret1: $ret1 ret2 $ret2"
echo "1: $1 2: $2 3: $3 4: $4 5: $5 6: $6 7: $7 8: $8 9: $9 10: $10"
exit 3
fi
;;

Zoals je kan zien heb ik geprobeerd om $ret op te vangen bij de unknown status alleen dit blijft verdacht leeg..

Alvast bedankt allemaal!

Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Als je in de Java code de argumenten uitprint, komt het argument met de spatie dan goed binnen? En belangrijker nog: is de query(string) dan goed? Dit kun je testen door te debuggen (ofwel System.out/err statements toevoegen, ofwel via de debugger in je favoriete IDE). Zo ja: dan kunnen we ophouden over Java en gaat het puur om hoe je er in je scripts mee omgaat.

Als ik je script goed lees, denk je blijkbaar dat wat je in Java met System.out print, als return-waarde terugkomt uit het proces. Dat is niet zo (tenzij $javacmd een script is dat daarvoor zorgt). Dat blijkt ook uit het feit dat $ret blijkbaar leeg is (is dat zo: checken door echo $ret direct na het uitvoeren van het Java proces).

Je blijft de hele tijd vragen stellen die je door even slim wat uit te printen op diverse plekken zo kan achterhalen. Check of je aannames kloppen met wat er echt gebeurt. Jij bent de enige die dat fatsoenlijk kan debuggen, aangezien wij je scripts en code niet hebben (en ook niet willen hebben).

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
ret=`$javacmd SqlJobMon "$2" "$4" "$6" "$7"`

En ik heb zo het gevoel dat je mijn testcode niet echt uitgevoerd hebt.

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Ik roep maar iets, maar heb je je spatie al eens ge-escaped?

Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
kluyze schreef op maandag 22 november 2010 @ 20:59:
Ik roep maar iets, maar heb je je spatie al eens ge-escaped?
Ik heb geen idee hoe ik dat zou kunnen doen behalve door de jobname tussen " " te zetten dus: "JOB 1"

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:14

Janoz

Moderator Devschuur®

!litemod

Ja, maar in geen enkel script dat je laat zien heb je dat gedaan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
escapen, dus door JOB\ 1 mee te geven

Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
Status update: Vandaag maar eens van begin af aan begonnen en stap voor stap functies toevoegen. Liep al vrij snel tegen de oplossing aan namelijk ret=`$javacmd SqlJobMon "$2" "$4" "$6" "$7"` ik dacht dat ik elke keer al dubbele quotes gebruikte maar die gebruikte ik voor de arguments van het bash script en niet voor de arguments van de SqlJobMon. Ik kreeg namelijk in java als ik JOB 1 invulde alleen JOB terug.

Nu werkt het dus wel gewoon goed, ik wil jullie allemaal bedanken voor de hulp en zie door het oplossen van dit probleem ook in dat je op een gegeven moment de knoop moet doorhakken en gewoon weer overnieuw gaan beginnen met je source net zolang totdat je je fout tegenkomt.

Nogmaals bedankt!

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Of je moet gewoon de tips uitvoeren. Als je mijn (test-)code vanuit de SH aangeroepen had dan was de output geweest:
code:
1
2
3
4
5
<hostname>
<username>
<password>
JOB
1


Waardoor ik de oplossing die ik 5 posts hievoor gaf nog eerder had gegeven. Die exact dezelfde oplossing bied, als die je uiteindelijk gevonden hebt. Zonde van je tijd en de mijne, zeker als je me ook nog eens met een PM om hulp vraagt.

Anyway what's done is done, blij dat het uiteindelijk gelukt is.

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 07:03

Haan

dotnetter

M34nM4chin3 schreef op dinsdag 23 november 2010 @ 17:05:
Nu werkt het dus wel gewoon goed, ik wil jullie allemaal bedanken voor de hulp en zie door het oplossen van dit probleem ook in dat je op een gegeven moment de knoop moet doorhakken en gewoon weer overnieuw gaan beginnen met je source net zolang totdat je je fout tegenkomt.
Fout. De volgende keer ga je leren hoe een debugger werkt, dan had je het probleem een week geleden al opgelost ;)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Snors
  • Registratie: Oktober 2007
  • Laatst online: 11-08 12:42
ReenL schreef op dinsdag 23 november 2010 @ 20:43:
Of je moet gewoon de tips uitvoeren. Als je mijn (test-)code vanuit de SH aangeroepen had dan was de output geweest:
code:
1
2
3
4
5
<hostname>
<username>
<password>
JOB
1


Waardoor ik de oplossing die ik 5 posts hievoor gaf nog eerder had gegeven. Die exact dezelfde oplossing bied, als die je uiteindelijk gevonden hebt. Zonde van je tijd en de mijne, zeker als je me ook nog eens met een PM om hulp vraagt.

Anyway what's done is done, blij dat het uiteindelijk gelukt is.
Ik citeer:
code:
1
2
3
4
5
6
Als ik bovenstaande code toevoeg en in unix zelf de java source uitvoer met arguments krijg ik dit terug:
[root@<servernaam> libexec]# /usr/java/jdk1.6.0_22/bin/java SqlJobMon <hostname> <username> <password> "JOB 1"
<hostname>
<username>
<password>
JOB 1

Ik raakte in de war met het bash script tijdens het invoeren van deze command, hier deed ik het eigelijk zelf al goed met de tip van jou alleen in het bash script stond het niet tussen " ". Het vragen van hulp in PM had ik misschien niet moeten doen maar dat zijn echt van die wanhopige acties dat als je door de bomen het bos niet meer ziet je alsnog graag erachter wil komen wat er precies aan de hand is.

Vooralsnog heel erg bedankt allemaal

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 22:14

Janoz

Moderator Devschuur®

!litemod

Als je dat stukje nu gewoon uitgevoerd had incl het bash scriptje had je gelijk gezien wat er aan de hand was. Echter bleef je je blindstaren op je javacode. Als je aanneemt dat de fout niet in deel A van je oplossing zit, maar op geen enkele manier het probleem kunt reproduceren in deel B van je oplossing dan moet je op dat moment je niet blind blijven staren op deel B van je code, maar even een stapje terug doen om te kijken of je aanname over deel A wel kloppen. Assumptions are the mother of all fuckups en ik neem aan dat je het met me eens bent dat dat ook bij dit geval het probleem was.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1