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 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel