Re: 100% cpu with: while true ;do read /dev/null ;done

2009-10-23 Thread Marc Herbert
Jo King a écrit :
 thanks for reply. agree it's not a
 bug with bash.

 i am inclinded to agree with the comments but bash is
 popular and attracts a lot of newbies into scripting - a bit
 of smart 'correction' of their wrong ways would at least
 keep the cpu available for other processes (even a sleep for
 100ms would make a huge difference).

Newbies should just stay clear from developing any advanced shell
script. There is way too much rope too hang themselves and your example
is just one among many other ways. There is plenty other, newer
programming environments that are far easier and safer to play with and
learn.

By the way the same hold for configuring firewalls. It becomes even
worse when it relates to security. (Security by newbies... ahem,
really?)

Cheers,

Marc




Re: 100% cpu with: while true ;do read /dev/null ;done

2009-10-22 Thread Pierre Gaston
On Thu, Oct 22, 2009 at 12:15 AM, Jo King joki...@yahoo.co.uk wrote:

 Configuration Information [Automatically generated, do not change]:
 Machine: i686
 OS: linux-gnu
 Compiler: gcc
 Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='i686'
 -DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i686-pc-linux-gnu'
 -DCONF_VENDOR='pc' -DLOCALEDIR='/usr/local/share/locale' -DPACKAGE='bash'
 -DSHELL -DHAVE_CONFIG_H   -I.  -I. -I./include -I./lib   -g -O2
 uname output: Linux puppypc 2.6.30.5 #1 SMP Tue Sep 1 15:48:26 GMT-8 2009
 i686 GNU/Linux
 Machine Type: i686-pc-linux-gnu

 Bash Version: 3.2
 Patch Level: 48
 Release Status: release

 Description:
[See subject for test case.
 Many scripts sit in a loop asking for user input - if script is
 run in bg/without tty (by mistake) then high cpu usage results]

 Repeat-By:
[while true ;do read /dev/null ;done]

 Fix:
[ bash/the read code could
  detect there's no stdin and sleep for 1-2 seconds]


Script waiting for user input in the background will be stopped on read, and
it will not result in a busy loop.

A script that expects a tty should test it with something like:

if ! [ -t 0 ]; then echo this script must be run in a terminal; exit 1;fi


I too believe that the scripts must be fixed, not bash


Re: 100% cpu with: while true ;do read /dev/null ;done

2009-10-22 Thread Jo King
 thanks for reply. agree it's not a
 bug with bash.
 
 i am inclinded to agree with the comments but bash is
 popular and attracts a lot of newbies into scripting - a bit
 of smart 'correction' of their wrong ways would at least
 keep the cpu available for other processes (even a sleep for
 100ms would make a huge difference).
 
 for info the script is firelog (network/firewall frontend)
 - written by a non-advanced bash coder, though i have come
 across similar with ksh on solaris/aix in the past.
 
 

--- On Thu, 22/10/09, Pierre Gaston pierre.gas...@gmail.com wrote:

 From: Pierre Gaston pierre.gas...@gmail.com
 Subject: Re: 100% cpu with: while true ;do read  /dev/null ;done
 To: Jo King joki...@yahoo.co.uk
 Cc: bug-bash@gnu.org
 Date: Thursday, 22 October, 2009, 7:08
 
 
 On Thu, Oct 22, 2009 at 12:15 AM,
 Jo King joki...@yahoo.co.uk
 wrote:
 
 
 Configuration Information [Automatically generated, do not
 change]:
 
 Machine: i686
 
 OS: linux-gnu
 
 Compiler: gcc
 
 Compilation CFLAGS:  -DPROGRAM='bash'
 -DCONF_HOSTTYPE='i686'
 -DCONF_OSTYPE='linux-gnu'
 -DCONF_MACHTYPE='i686-pc-linux-gnu'
 -DCONF_VENDOR='pc'
 -DLOCALEDIR='/usr/local/share/locale'
 -DPACKAGE='bash' -DSHELL -DHAVE_CONFIG_H   -I.
  -I. -I./include -I./lib   -g -O2
 
 
 
 uname output: Linux puppypc 2.6.30.5 #1 SMP Tue Sep 1
 15:48:26 GMT-8 2009 i686 GNU/Linux
 
 Machine Type: i686-pc-linux-gnu
 
 
 
 Bash Version: 3.2
 
 Patch Level: 48
 
 Release Status: release
 
 
 
 Description:
 
         [See subject for test case.
 
 Many scripts sit in a loop asking for user input - if
 script is
 
 run in bg/without tty (by mistake) then high cpu usage
 results]
 
 
 
 Repeat-By:
 
         [while true ;do read /dev/null ;done]
 
 
 
 Fix:
 
         [ bash/the read code could
 
  detect there's no stdin and sleep for 1-2 seconds]
 
 Script waiting for user input in the background will be
 stopped on read, and it will not result in a busy loop.
 
 A script that expects a tty should test it with something
 like:
 
 
 
 if ! [ -t 0 ]; then echo this script must be run in a
 terminal; exit 1;fi  
 
 I too believe that the scripts must be fixed, not bash
 
 







100% cpu with: while true ;do read /dev/null ;done

2009-10-21 Thread Jo King
Configuration Information [Automatically generated, do not change]:
Machine: i686
OS: linux-gnu
Compiler: gcc
Compilation CFLAGS:  -DPROGRAM='bash' -DCONF_HOSTTYPE='i686' 
-DCONF_OSTYPE='linux-gnu' -DCONF_MACHTYPE='i686-pc-linux-gnu' 
-DCONF_VENDOR='pc' -DLOCALEDIR='/usr/local/share/locale' -DPACKAGE='bash' 
-DSHELL -DHAVE_CONFIG_H   -I.  -I. -I./include -I./lib   -g -O2
uname output: Linux puppypc 2.6.30.5 #1 SMP Tue Sep 1 15:48:26 GMT-8 2009 i686 
GNU/Linux
Machine Type: i686-pc-linux-gnu

Bash Version: 3.2
Patch Level: 48
Release Status: release

Description:
[See subject for test case. 
Many scripts sit in a loop asking for user input - if script is
run in bg/without tty (by mistake) then high cpu usage results]

Repeat-By:
[while true ;do read /dev/null ;done]

Fix:
[ bash/the read code could
 detect there's no stdin and sleep for 1-2 seconds]








Re: 100% cpu with: while true ;do read /dev/null ;done

2009-10-21 Thread Jan Schampera
Jo King schrieb:

 Fix:
   [ bash/the read code could
  detect there's no stdin and sleep for 1-2 seconds]

If you consider this as a bug, the bug is not in Bash (but in the
application).

In short you request that read should wait a second, once it got a
end-of-file signalled, I don't think this is the way to 'fix' this
'bug'. It has far too many side effects or impacts to other uses of
read. Fix your application instead, query the exit code of read
(non-zero on EOF, timeout or error) and insert a conditional sleep yourself.

By the way (not really serious, but it fits): A CPU constantly below
100% is wasted money ;-)

Jan




Re: 100% cpu with: while true ;do read /dev/null ;done

2009-10-21 Thread Mike Frysinger
On Thursday 22 October 2009 01:10:33 Jan Schampera wrote:
 Jo King schrieb:
  Fix:
  [ bash/the read code could
   detect there's no stdin and sleep for 1-2 seconds]
 
 If you consider this as a bug, the bug is not in Bash (but in the
 application).
 
 In short you request that read should wait a second, once it got a
 end-of-file signalled, I don't think this is the way to 'fix' this
 'bug'. It has far too many side effects or impacts to other uses of
 read. Fix your application instead, query the exit code of read
 (non-zero on EOF, timeout or error) and insert a conditional sleep
  yourself.

and the code can easily be fixed b adding -t 1 to the read invocation
-mike


signature.asc
Description: This is a digitally signed message part.