Hello

some days ago i had some problems with mkdirs() with some services running in Tomcat-WebApps.
(Subject was "writing to File-System; IOException on File.mkdirs() and/or File.createNewFile()" )


Doug gave me the final hint which helped me to solve the problem. (although i have to confess, that i do not understand all in detail why it did not worked "before" and why it is working "now" ....)

Originally i (or "my admin") wanted to start tomcat using jsvc like it is recommended here -> http://jakarta.apache.org/tomcat/tomcat-5.0-doc/setup.html


ps auxfw
shows me that jsvc is running as root,
#----------------------------
root 9267 0.0 0.0 28 28 ? S Apr17 0:02 runsv tomcat
root 23875 0.0 0.0 1412 560 ? S 00:00 0:00 \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:SurvivorRatio=8
tomcat5 23878 82.0 1.2 686988 26008 ? R 00:00 0:00 \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:SurvivorRati
tomcat5 23879 0.0 1.2 686988 26012 ? S 00:00 0:00 \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:Survivor
tomcat5 23880 2.0 1.2 686988 26012 ? S 00:00 0:00 \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:Surv
tomcat5 23881 0.0 1.2 686988 26020 ? S 00:00 0:00 \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:Surv
tomcat5 23882 0.0 1.2 686988 26020 ? S 00:00 0:00 \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:Surv
#.....
#----------------------------
although the script which calls jsvc wants tomcat5 to run it ...


#---------- script to call jsvc -----------------------------
#!/bin/sh
JAVA_HOME=/usr/java
JAVA_OPTS="${JAVA_OPTS} -XX:NewSize=48m -XX:MaxNewSize=48m -XX:SurvivorRatio=8 -Xms128m -Xmx512m"
CATALINA_OPTS=
CATALINA_BASE=/home/hmb/catalina_5_19
#CATALINA_BASE=/tomcat/hmb
export CATALINA_BASE
CATALINA_HOME=$CATALINA_BASE
CATALINA_TMPDIR="$CATALINA_BASE"/temp
JAVA_ENDORSED_DIRS="$CATALINA_HOME"/common/endorsed


CLASSPATH=\
$CATALINA_HOME/bin/commons-logging-api.jar:\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar


. $CATALINA_HOME/bin/custom.sh


umask 006

exec $CATALINA_HOME/bin/jsvc $JAVA_OPTS $CATALINA_OPTS \
   -user tomcat5 \
       -nodetach \
   -home $JAVA_HOME \
       -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
       -Dcatalina.base=$CATALINA_BASE \
   -Dcatalina.home=$CATALINA_HOME \
       -Djava.io.tmpdir=$CATALINA_TMPDIR \
   -outfile $CATALINA_BASE/logs/catalina.out \
   -errfile '&1' \
   $CATALINA_OPTS \
   -cp $CLASSPATH \
   org.apache.catalina.startup.Bootstrap
#---------- EOF: script to call jsvc -----------------------------

when i call catalina.sh to start tomcat, e.g. see below

#------- another script starting tomcat by using catalina.sh ----------------
#!/bin/sh
# XDEBUG="-Xnoagent -Xdebug -Xrunjdwp:transport=dt_socket,address=8001,server=y,suspend=n"
# export XDEBUG
. ./custom.sh
JAVA_OPTS="${JAVA_OPTS} -XX:NewSize=48m -XX:MaxNewSize=48m -XX:SurvivorRatio=8 -Xms128m -Xmx512m"
export JAVA_OPTS
./catalina.sh start
#------- EOF: another script startin tomcat by using catalina.sh ----------------



all processes belong to tomcat5 and everything is fine
ps auxfw =>
#-----------------------------
tomcat5 25099 28.3 3.3 708200 68588 pts/1 S 00:11 0:03 /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/catalina_5
tomcat5 25100 0.0 3.3 708200 68588 pts/1 S 00:11 0:00 \_ /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/catali
tomcat5 25101 0.9 3.3 708200 68588 pts/1 S 00:11 0:00 \_ /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/ca
tomcat5 25102 0.0 3.3 708200 68588 pts/1 S 00:11 0:00 \_ /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/ca
# .....
#-----------------------------


there are good reasons to start tomcat using jsvc, but when i do it, i have some problems with permissions in the file-system.
are there some jsvc-cracks which already know the problem i described or did i something "wrong".
by the way, i have no reason to run tomcat as privileged service, port 8080 is okay.


thanks in advance,
kind reagrds,
christoph

Christoph,

If you are going to run Tomcat on port 8080 and 8443 then you can use the
normal startup script. If you need it on port 80 the you have two choices,
run as root (not good) or use jsrv daemon which starts tomcat as root then
changes the user id as set in the startup script.

If you need to respawn the process if it fails then call the startup.sh from
the inittab with repawn.

Glad you got it going.

Good luck.

Doug

----- Original Message ----- From: "Christoph Meier" <[EMAIL PROTECTED]>
To: "Tomcat Users List" <[EMAIL PROTECTED]>
Sent: Sunday, May 02, 2004 10:42 AM
Subject: Re: writing to File-System; IOException on File.mkdirs() and/or
File.createNewFile()





Doug

finally, it works.



This appears to be a permissions issue. ...



you are right.
you might remember that i started Tomcat with a custom-script (see some
post before)
ps -auxfw =>
#--------------------
root 9267 0.0 0.0 28 28 ? S Apr17 0:02 runsv


tomcat


root     29989  0.0  0.0  1416  564 ?        S    16:26   0:00  \_
jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:SurvivorRatio=8
tomcat5  29992  6.9  3.3 708184 68556 ?      S    16:26   0:03      \_
jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:SurvivorRati
tomcat5  29993  0.0  3.3 708184 68556 ?      S    16:26   0:00
\_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:Survivor
tomcat5  29994  0.3  3.3 708184 68556 ?      S    16:26
0:00              \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:Surv
tomcat5  29995  0.0  3.3 708184 68556 ?      S    16:26
0:00              \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=48m -XX:Surv
tomcat5  29996  0.0  3.3 708184 68556 ?      S    16:26
0:00              \_ jsvc.exec -XX:NewSize=48m -XX:MaxNewSize=4
#--------------------
the process on top still belongs root (which i did not expected) , but
this is just an observation,
is still do not understand its effect


after your mail i tried using the "normal" catalina.sh start => #----------------------------------------------- tomcat5 30290 70.0 2.3 696512 48568 pts/4 R 16:29 0:02 /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/catalina_5 tomcat5 30291 0.0 2.3 696512 48572 pts/4 S 16:29 0:00 \_ /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/catali tomcat5 30292 0.0 2.3 696512 48572 pts/4 S 16:29 0:00 \_ /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/ca tomcat5 30293 0.0 2.3 696512 48572 pts/4 S 16:29 0:00 \_ /usr/java/bin/java -Dlog4j.configuration=file:////home/hmb/ca tomcat5 30294 0.0 2.3 696512 48572 pts/4 S 16:29 #--------------------

now even the Tomcat-"top"-process belomgs to tomcat5 and everything works.

actually it was "our" admin who advised to use the runsv-daemon to
controll the tomcat-process ... its job is to restart the process if
Tomcat-top-process should go down ... actually a practically thing ...
but well



It may be the file system does not like the mkdirs() command for non


root


users.




such behaviour i would considerate as a bug.
i'm extremly happy this is not the case.


Thanks for your hints!


_christoph



Another test would be to logon as tomcat5 and run your program from the
shell. If it fails, that backs up the idea that you need to be root to


run


mkdirs(). Or that you still don't have the correct permissions set.

Do a ls -l on your directories and drill down several levels to ensure


that


the change propagated down.

Next look at the directories and see if the command mkdirs() created any


of


the levels.

Also what are the permissions set for on the catalina_5_19 directory?

I am no expert on this by far and it is possible that I am missing
something.

As another test, I you would like, email me directly your test file and I
will run it on my test box. I am also running TC5 on Linux and JDK1.4.2.

Doug


----- Original Message ----- From: "Christoph Meier" <[EMAIL PROTECTED]>
To: "Parsons Technical Services" <[EMAIL PROTECTED]>
Sent: Saturday, May 01, 2004 7:02 AM
Subject: Re: writing to File-System; IOException on File.mkdirs() and/or
File.createNewFile()







Doug

thanks for your hint.
when running tomcat as root, now it works (i thought that i already
tried that out, obvisouly i didn't)
...  the TestService worked suddenly, other parts of my cms-app i had
to "fix" a bit; it seems like there some file operations which work on
solaris with a jdk1.3 but do not not with the jdk1.4.2 on linux; but i
adapted it now

.... BUT
... after doing
# chown -Rc tomcat5 /home/hmb/catalina_5_19
and
# chgrp -Rc tomcat5 /home/hmb/catalina_5_19

and starting tomcat as tomcat5...
... i have the same problems like before



java.io.IOException:





/home/hmb/catalina_5_19/webapps/hmb/cms-content/edit/contents/xml/pages/de.


x


ml




java.io.IOException:





/home/hmb/catalina_5_19/webapps/hmb/cms-content/edit/contents/xml/pages/de.


x


ml




at java.io.UnixFileSystem.createFileExclusively(Native Method) at
java.io.File.createNewFile(File.java:828) at
ch.webmover.cms.content.page.XmlCmsPage.save
<<<<<<<<<<

... whereas the root-cause for the failing of  >>createNewFile()<< still
is the failing of mkdirs() like describedin my last post ...

anyway, Doug, thank you.

_christoph





Christoph,

Just as a quick test try this.

Start Tomcat from the prompt as root using
/home/hmb/catalina_5_19/bin/startup.sh

If it works you have a permissions problem.

# chown -Rc tomcat5 /home/hmb/catalina_5_19

and for good measure

# chgrp -Rc tomcat5 /home/hmb/catalina_5_19

Note the permissions on the directories as well as the files.

From your first post it appears that you can read a file if it is


there




and




write one as well. The real issue is in creating a directory. Is this
correct?

Doug
www.parsonstechnical.com



----- Original Message ----- From: "Christoph Meier" <[EMAIL PROTECTED]>
To: "Tomcat Users List" <[EMAIL PROTECTED]>
Sent: Thursday, April 29, 2004 7:28 PM
Subject: Re: writing to File-System; IOException on File.mkdirs()


and/or


File.createNewFile()








Hi

today i was debugging a lillte bit deeper (into sdk 1.4.2) to find out
where the IOException ecatly is thrown ...
in my desperation i also tried an alternative jre (blackdown); the
debugging i did with standard sun j2se

... may be this can help somebody to give me the final hint.

at the end of this mail i attach the script i'm using to start Tomcat
(onto which i added a "umask 006" ...)

-> debugging aFile.mkdirs()
-----------------------------------------------------
public class File implements java.io.Serializable, Comparable {
// ...
static private FileSystem fs = FileSystem.getFileSystem();

public boolean mkdirs() {
if (exists()) {
    return false;
}
if (mkdir()) {
     return true;
 }
    File canonFile = null;
    try {
        canonFile = getCanonicalFile();
    } catch (IOException e){      // -> 1
        return false;
    }
String parent = canonFile.getParent();
    return (parent != null) && (new File(parent).mkdirs() &&
canonFile.mkdir());
}
// ...
public File getCanonicalFile() throws IOException {
   return new File(getCanonicalPath());
}
// ...
public String getCanonicalPath() throws IOException {
  return fs.canonicalize(fs.resolve(this));
}

// ...

}
--------------------------------------------

Exception is thrown at (1)  in >>mkdirs()<<
when calling  >>getCanonicalFile()<<
the IOException is passed from  >>getCanonicalPath()<<
within >>getCanonicalPath()<<  it is   >>fs.canonicalize()<<  which




fails.




fs<< is the plattform-dependant Implementation of abstract




java.io.FileSystem , for which i had no Source-Code to debugg into;
actually it is java.io.UnixFileSystem, and i know how it looks like
(see







http://www.cs.purdue.edu/homes/palsberg/cs565/java-source/java.1.2.2/src/s


o




laris/classes/java/io/UnixFileSystem.java






, maybe there is a newer version somewhere )

in UnixFileSystem (see Link above)  >>canonicalize()<< calls a native
method;
#---- snippet ----
public native String canonicalize(String path) throws IOException;
#----------------


the stack trace when calling directly >>aFile.getCanonicalPath()<< im
my TestService looks like:
->
.#-------------------------------------
java.io.IOException: Bad pathname
at java.io.UnixFileSystem.canonicalize0(Native Method)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:154)
at java.io.File.getCanonicalPath(File.java:513)
at ch.hmb.app.service.TestService.writeTo(TestService.java:78)
#---------------------------------------
.. the "Bad pathname" is nothing else than
"home/hmb/catalina_5_19/webapps/hmb/a/1.txt" which should't be that


bad


...(i guessed)
... later on in my TestService  ...
when calling >>aFile.createNewFile()<<  next Exception is thrown
#------------------------------------------------------------------
     at java.io.UnixFileSystem.createFileExclusively(Native Method)
     at java.io.File.createNewFile(File.java:828)
     at ch.hmb.app.service.TestService.writeTo(TestService.java:94)
#----------------------------------------------------
... but that's no more mistery since >>mkdirs()<< already failed




below are the stacks from the Exceptions thrown when using blackdown-jre ... looks the same #------------------------------------- java.io.IOException: Bad pathname at java.io.UnixFileSystem.canonicalize0(Native Method) at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:154) at java.io.File.getCanonicalPath(File.java:513) at ch.hmb.app.service.TestService.writeTo(TestService.java:78) #--------------------------------------- java.io.IOException: /home/hmb/catalina_5_19/webapps/hmb/a/1.txt at java.io.UnixFileSystem.createFileExclusively(Native Method) at java.io.File.createNewFile(File.java:828) at ch.hmb.app.service.TestService.writeTo(TestService.java:94) #----------------------------------------------------


to finish i would like to emphasise again, that i still have another Class "Test" which works fine concerning




mkdirs()<< and >>createNewFile()<< when i start it directly from


the




shell (without Tomcat)

->
[EMAIL PROTECTED]:~$ /usr/java/bin/java Test
/home/hmb/catalina_5_19/webapps/hmb/1/2/3/4/myFile.txt
-> and the File is written!!!

well, i still hope to find a solution ... may be someone has a good






hint?






thanks,
regards,
christoph



############## start-script ########################
JAVA_HOME=/usr/java
JAVA_OPTS="${JAVA_OPTS} -XX:NewSize=48m -XX:MaxNewSize=48m
-XX:SurvivorRatio=8 -Xms128m -Xmx512m"
CATALINA_OPTS=
CATALINA_BASE=/home/hmb/catalina_5_19
CATALINA_HOME=$CATALINA_BASE
CATALINA_TMPDIR="$CATALINA_BASE"/webapps/hmb
JAVA_ENDORSED_DIRS="$CATALINA_HOME"/common/endorsed

CLASSPATH=\
$JAVA_HOME/lib/tools.jar:\
$CATALINA_HOME/bin/commons-daemon.jar:\
$CATALINA_HOME/bin/bootstrap.jar

. $CATALINA_HOME/bin/custom.sh

umask 006

exec $CATALINA_HOME/bin/jsvc $JAVA_OPTS $CATALINA_OPTS \
 -user tomcat5 \
             -nodetach \
 -home $JAVA_HOME \
             -Djava.endorsed.dirs="$JAVA_ENDORSED_DIRS" \
             -Dcatalina.base=$CATALINA_BASE \
 -Dcatalina.home=$CATALINA_HOME \
 -Djava.io.tmpdir=$CATALINA_TMPDIR \
 -outfile /home/hmb/catalina_5_19/logs/catalina.out \
 -errfile '&1' \
 $CATALINA_OPTS \
 -cp $CLASSPATH \
 org.apache.catalina.startup.Bootstrap

############ EOF: start-script ########################







Hallo

i have some problems writing Files to the local harddisk.
running Tomcat 5.19 on a Linux with a jre1.4.2, Tomcat started


without


security-option;
process-owner is a user called "tomcat5"

i'm trying to write a File (from scratch)  into
$catalinaBase/webapps/myApp/  .
$catalinaBase/**  belongs to user tomcat5, Permissions set to 770  .

i'm doing something like:






-------------------------------------------------------------------------






File aFile = new File(aFilePath);
if (!aFile.mkdirs()){
//
}
if (aFile.exists()){
if (!aFile.delete()){
//
}
}
try {
aFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
// adding some xml into the file ...
addContentToFile(aFile);
------------------------------------------------------------
if the parent directory of "aFilePath" already exists, everything
works fine ...
if one of the parent-dirs is missing, it fails ...
e.g. $catalinaBase/webapps/myApp/myTestFile.txt wil be created


(since


$catalinaBase/webapps/myApp already exists), but
$catalinaBase/webapps/myApp/a/b/c/myTestFile.txt  fails  ....

when debugging i see that  >>aFile.mkdirs()<< returns false ... but
since it throws no Exception, i has no clear idea why mkdirs() fails,
later in the code >>aFile.createNewFile()<< throws an IOException ...


java.io.IOException: /home/hmb/catalina_5_19/webapps/hmb/a/1.txt
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:828)
at ch.hmb.app.service.TestService.writeTo(TestService.java:93)
<<
when inspecting the IOException with debugger (using Eclipse build
30M8) root-cause of IOException or its localized message only


contains


the path of the File which i wanted to create ... (e.g.
/home/hmb/catalina_5_19/webapps/hmb/a/1.txt)

the "funny" thing is, all works fine with same Deployment on win2000
and solaris (with same permissions set, i guess).

has somebody an idea? does the problem concern rights/permissions
and/or user/groups on the file-system or must i do a special grant in
the cataliny.policy (and starting tomcat with the security option)?

thanks in advance,
kind regards
christoph


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]







---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




















--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]











--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to