This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: stdout/stderr handling by cygrunsrv/bash/tcl


--- Igor Pechtchanski wrote:
> On Tue, 2 Mar 2004, Patrick Samson wrote:
> 
> > I run a service installed as:
> >
> > cygrunsrv --install pgr-daemon
> >  --path /usr/bin/bash.exe
> >  --args "--login /opt/pgreplica/bin/pgrd host1
> host2"
> >  --user pgreplicator
> >  --shutdown
> >
> > Everything is fine with stdout.  Messages are in
> /var/log/pgr-daemon.log
> >
> > But if my application, which is a TCL script,
> writes something on stderr
> > (as "puts stderr $msg"),
> > This message is written:
> > - at the beginning of the file, overwriting the
> existing stdout text.
> > - only when the service is stopped.
> >
> > Is it an as-is behaviour, a lack or a mistake in
> the command syntaxes,
> > or something wrong in cygrunsrv or bash or tcl?
> 
> Patrick,
> 
> WFM.  I can't reproduce your problem on Win2k
> (without Tcl and --user).
> Here's what I did:
> 
> $ mkdir /tmp/servicetest && cd /tmp/servicetest
> $ cat > service.sh
> #!/bin/bash
> terminate() {
>   echo "Terminating" >&2
>   exit 0
> }
> trap terminate INT
> echo "Starting service" >&2
> trap -p
> while true; do
>   sleep 10
>   echo "STDERR" >&2
>   echo "STDOUT" >&1
> done
> $ cygrunsrv --install test-daemon --path
> /usr/bin/bash.exe --args "--login
> /tmp/servicetest/service.sh" --termsig INT
> --shutdown
> $ cygrunsrv -S test-daemon; sleep 30; cygrunsrv -E
> test-daemon
> $ cat /var/log/test-daemon.log
> Starting service
> trap -- 'terminate' SIGINT
> STDERR
> STDOUT
> STDERR
> STDOUT
> STDERR
> STDOUT
> Terminating
> $
> 
> So, messages going to stdout/stderr were properly
> redirected.  If the
> above works for you, try adding a Tcl call to the
> test script, and see if
> it changes anything.

Your demo works as expected. But TCL introduces
the mess.

I changed the script to:

$ cat service.sh
#!/bin/bash
# the next line restart using tclsh \
exec tclsh "$0" "$@"

puts "Starting service"
while {true} {
  # wait 1 sec
  after 1000
  puts stderr "STDERR"
  puts "STDOUT"
}
$ cygrunsrv -S test-daemon; sleep 3; cygrunsrv -E
test-daemon
$ cat /var/log/test-daemon.log
STDERR
STDERR
STDERR
STDERR

STDOUT
STDOUT

It looks like the overwriting of these two lines
(cr lf are replaced by space):
STDERR  STDERR  STDERR  STDERR
Starting service  STDOUT  STDOUT  STDOUT  STDOUT

Just for the understanding, another trial with the
script beginning with a write to stderr:

$ cat service.sh
#!/bin/bash
# the next line restart using tclsh \
exec tclsh "$0" "$@"

puts stderr "Write stderr"
puts "Starting service"
while {true} {
  # wait 1 sec
  after 1000
  puts stderr "STDERR"
  puts "STDOUT"
}
$ cygrunsrv -S test-daemon; sleep 3; cygrunsrv -E
test-daemon
$ cat /var/log/test-daemon.log
Starting serviSTDESTDOSTDESTDOSTDESTDOSTDESTDOUT

Again the overwriting of these two lines:
Write stderr  STDERR  STDERR  STDERR  STDERR
Starting service  STDOUT  STDOUT  STDOUT  STDOUT

If I run the TCL directly, it's ok, no surprise:
$ ./service.sh
Write stderr
Starting service
STDERR
STDOUT
STDERR
STDOUT
STDERR
STDOUT
<manually interruped with ctrl/c>
$ ./service.sh >service.log 2>&1
<manually interruped with ctrl/c>
$ cat service.log
Write stderr
Starting service
STDERR
STDOUT
STDERR
STDOUT
STDERR
STDOUT

I wouldn't use this syntax, but it shows the same
problem, so it may be a clue:

$ ./service.sh >service.log 2>service.log
<manually interruped with ctrl/c>
$ cat service.log
Starting serviSTDESTDOSTDESTDOSTDESTDOUT

Continuing on this way, consider:
serviceSH.sh as the shell script of Igor,
serviceTCL.sh as the TCL script.

$ ./serviceSH.sh >service.log 2>service.log
trap -- 'terminateSTDERR
STDERR
Terminating

$ ./serviceSH.sh >>service.log 2>>service.log

Starting service
trap -- 'terminate' SIGINT
STDERR
STDOUT
STDERR
STDOUT
STDERR
STDOUT
Terminating

$ ./serviceTCL.sh >service.log 2>service.log

Starting serviSTDESTDOSTDESTDOSTDESTDOUT

$ ./serviceTCL.sh >>service.log 2>>service.log

Starting serviSTDESTDOSTDESTDOSTDESTDOSTDESTDOUT

Can someone tell us how cygrunsrv manages the
redirections? It's a step toward the explanation.



__________________________________
Do you Yahoo!?
Yahoo! Search - Find what you?re looking for faster
http://search.yahoo.com

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]