WANG Chao
2013-07-15 09:56:29 UTC
Hi,
I have a service (a script) running under systemd and need its stderr to
be output'd immediately, not line buffered. I tried serveral ways but
didn't work out. I hope to get some feedback here :)
Here's my foobar.service:
--
[Service]
Type=oneshot
ExecStart=-/bin/foobar.sh
StandardInput=null
StandardOutput=syslog
StandardError=syslog+console
--
My foobar.sh:
--
#!/bin/sh
echo "Here we go"
for i in `seq 1 10`; do
echo -n a >&2
sleep 0.1
done
--
If run `/bin/foobar.sh` directly, I get char 'a' popping up to console
one by one each 0.1 second. And this is what I expect.
But if I run `systemctl restart foobar.service`, a string "aaaaaaaaaa"
altogether pops up after 1 second.
I've got a ugly workaround by redirecting stderr to /dev/console.
However, I lost the systemd journal feature though :(
I look into the systemd.exec(5), it says in the "StandardOutput=" part:
"[..]syslog+console, journal+console and kmsg+console work similarly but
copy the output to the system console as well"
So systemd first write to syslog/journal then copy the output to
console. And it looks like systemd would use line buffering for both
stdout and stderr.
I'm wondering if there's a way to change the output buffer mode to
unbuffered for a systemd service.
If not, should systemd change stderr buffer mode to unbuffered? Like the
most common situations in Linux.
Also I want to mention that with line buffering, it's impossible to
update information in-place (something like calling times of echo -e
"blah\r", later output will override the former one).
Any comments are welcome! Thanks!
WANG Chao
I have a service (a script) running under systemd and need its stderr to
be output'd immediately, not line buffered. I tried serveral ways but
didn't work out. I hope to get some feedback here :)
Here's my foobar.service:
--
[Service]
Type=oneshot
ExecStart=-/bin/foobar.sh
StandardInput=null
StandardOutput=syslog
StandardError=syslog+console
--
My foobar.sh:
--
#!/bin/sh
echo "Here we go"
for i in `seq 1 10`; do
echo -n a >&2
sleep 0.1
done
--
If run `/bin/foobar.sh` directly, I get char 'a' popping up to console
one by one each 0.1 second. And this is what I expect.
But if I run `systemctl restart foobar.service`, a string "aaaaaaaaaa"
altogether pops up after 1 second.
I've got a ugly workaround by redirecting stderr to /dev/console.
However, I lost the systemd journal feature though :(
I look into the systemd.exec(5), it says in the "StandardOutput=" part:
"[..]syslog+console, journal+console and kmsg+console work similarly but
copy the output to the system console as well"
So systemd first write to syslog/journal then copy the output to
console. And it looks like systemd would use line buffering for both
stdout and stderr.
I'm wondering if there's a way to change the output buffer mode to
unbuffered for a systemd service.
If not, should systemd change stderr buffer mode to unbuffered? Like the
most common situations in Linux.
Also I want to mention that with line buffering, it's impossible to
update information in-place (something like calling times of echo -e
"blah\r", later output will override the former one).
Any comments are welcome! Thanks!
WANG Chao