This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: stdout/stderr handling by cygrunsrv/bash/tcl
- From: Patrick Samson <p_samson at yahoo dot com>
- To: cygwin at cygwin dot com
- Date: Wed, 3 Mar 2004 02:19:53 -0800 (PST)
- Subject: 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/