Shell: is it possible to delay a command without using `sleep`?
up vote
17
down vote
favorite
Are there any substitutes, alternatives or bash tricks for delaying commands without using sleep
? For example, performing the below command without actually using sleep:
$ sleep 10 && echo "This is a test"
linux bash shell-script shell sleep
New contributor
|
show 4 more comments
up vote
17
down vote
favorite
Are there any substitutes, alternatives or bash tricks for delaying commands without using sleep
? For example, performing the below command without actually using sleep:
$ sleep 10 && echo "This is a test"
linux bash shell-script shell sleep
New contributor
40
What's wrong withsleep
?
– muru
2 days ago
4
There's no real reason other than curiosity. I thought it would be interesting to learn some alternative solutions. I thinkat
might be one, but I couldn't find any usage examples.
– user321697
2 days ago
What do you want to wait for? If there’s an event you’re waiting for, you’d typically use a while loop, testing for the condition and sleeping for one second (or whatever makes sense). If you’re waiting for a child process to finish, then you can use the wait builtin. If it’s something else, do elaborate, please.
– Grega Bremec
2 days ago
1
I came here expecting everyone to suggest a spinlock. I'm pleasantly surprised by all the answers.
– Daan van Hoek
2 days ago
2
Re: "Curiosity" -- in unix.stackexchange.com/help/dont-ask, note the requirement that "You should only ask practical, answerable questions based on actual problems that you face." -- that this has been well-received despite controvening that guideline makes it a rather rare exception.
– Charles Duffy
yesterday
|
show 4 more comments
up vote
17
down vote
favorite
up vote
17
down vote
favorite
Are there any substitutes, alternatives or bash tricks for delaying commands without using sleep
? For example, performing the below command without actually using sleep:
$ sleep 10 && echo "This is a test"
linux bash shell-script shell sleep
New contributor
Are there any substitutes, alternatives or bash tricks for delaying commands without using sleep
? For example, performing the below command without actually using sleep:
$ sleep 10 && echo "This is a test"
linux bash shell-script shell sleep
linux bash shell-script shell sleep
New contributor
New contributor
edited 2 days ago
Fabby
3,04411126
3,04411126
New contributor
asked 2 days ago
user321697
9914
9914
New contributor
New contributor
40
What's wrong withsleep
?
– muru
2 days ago
4
There's no real reason other than curiosity. I thought it would be interesting to learn some alternative solutions. I thinkat
might be one, but I couldn't find any usage examples.
– user321697
2 days ago
What do you want to wait for? If there’s an event you’re waiting for, you’d typically use a while loop, testing for the condition and sleeping for one second (or whatever makes sense). If you’re waiting for a child process to finish, then you can use the wait builtin. If it’s something else, do elaborate, please.
– Grega Bremec
2 days ago
1
I came here expecting everyone to suggest a spinlock. I'm pleasantly surprised by all the answers.
– Daan van Hoek
2 days ago
2
Re: "Curiosity" -- in unix.stackexchange.com/help/dont-ask, note the requirement that "You should only ask practical, answerable questions based on actual problems that you face." -- that this has been well-received despite controvening that guideline makes it a rather rare exception.
– Charles Duffy
yesterday
|
show 4 more comments
40
What's wrong withsleep
?
– muru
2 days ago
4
There's no real reason other than curiosity. I thought it would be interesting to learn some alternative solutions. I thinkat
might be one, but I couldn't find any usage examples.
– user321697
2 days ago
What do you want to wait for? If there’s an event you’re waiting for, you’d typically use a while loop, testing for the condition and sleeping for one second (or whatever makes sense). If you’re waiting for a child process to finish, then you can use the wait builtin. If it’s something else, do elaborate, please.
– Grega Bremec
2 days ago
1
I came here expecting everyone to suggest a spinlock. I'm pleasantly surprised by all the answers.
– Daan van Hoek
2 days ago
2
Re: "Curiosity" -- in unix.stackexchange.com/help/dont-ask, note the requirement that "You should only ask practical, answerable questions based on actual problems that you face." -- that this has been well-received despite controvening that guideline makes it a rather rare exception.
– Charles Duffy
yesterday
40
40
What's wrong with
sleep
?– muru
2 days ago
What's wrong with
sleep
?– muru
2 days ago
4
4
There's no real reason other than curiosity. I thought it would be interesting to learn some alternative solutions. I think
at
might be one, but I couldn't find any usage examples.– user321697
2 days ago
There's no real reason other than curiosity. I thought it would be interesting to learn some alternative solutions. I think
at
might be one, but I couldn't find any usage examples.– user321697
2 days ago
What do you want to wait for? If there’s an event you’re waiting for, you’d typically use a while loop, testing for the condition and sleeping for one second (or whatever makes sense). If you’re waiting for a child process to finish, then you can use the wait builtin. If it’s something else, do elaborate, please.
– Grega Bremec
2 days ago
What do you want to wait for? If there’s an event you’re waiting for, you’d typically use a while loop, testing for the condition and sleeping for one second (or whatever makes sense). If you’re waiting for a child process to finish, then you can use the wait builtin. If it’s something else, do elaborate, please.
– Grega Bremec
2 days ago
1
1
I came here expecting everyone to suggest a spinlock. I'm pleasantly surprised by all the answers.
– Daan van Hoek
2 days ago
I came here expecting everyone to suggest a spinlock. I'm pleasantly surprised by all the answers.
– Daan van Hoek
2 days ago
2
2
Re: "Curiosity" -- in unix.stackexchange.com/help/dont-ask, note the requirement that "You should only ask practical, answerable questions based on actual problems that you face." -- that this has been well-received despite controvening that guideline makes it a rather rare exception.
– Charles Duffy
yesterday
Re: "Curiosity" -- in unix.stackexchange.com/help/dont-ask, note the requirement that "You should only ask practical, answerable questions based on actual problems that you face." -- that this has been well-received despite controvening that guideline makes it a rather rare exception.
– Charles Duffy
yesterday
|
show 4 more comments
10 Answers
10
active
oldest
votes
up vote
13
down vote
accepted
You have alternatives to sleep
: They are at
and cron
. Contrary to sleep
these need you to provide the time at which you need them to run.
Make sure the
atd
service is running by executingservice atd status
.
Now let's say the date is 11:17 am UTC; if you need to execute a command at 11:25 UTC, the syntax is:echo "This is a test" | at 11:25
.
Now keep in mind thatatd
by default will not be logging the completion of the jobs. For more refer this link. It's better that your application has its own logging.You can schedule jobs in
cron
, for more refer :man cron
to see its options orcrontab -e
to add new jobs./var/log/cron
can be checked for the info on execution on jobs.
FYI sleep system call
suspends the current execution and schedules it w.r.t. the argument passed to it.
EDIT:
As @Gaius mentioned , you can also add minutes time to at
command.But lets say time is 12:30:30
and now you ran the scheduler with now +1 minutes
. Even though 1 minute, which translates to 60 seconds was specified , the at
doesn't really wait till 12:31:30
to execute the job, rather it executes the job at 12:31:00
. The time-units can be minutes, hours, days, or weeks
. For more refer man at
e.g: echo "ls" | at now +1 minutes
6
This is not true, you can schedule an at job for say now +1 minute, to run in a minutes time
– Gaius
2 days ago
add a comment |
up vote
25
down vote
With bash
builtins, you can do:
coproc read -t 10 && wait "$!" || true
To sleep for 10 seconds without using sleep
. The coproc
is to make so that read
's stdin is a pipe where nothing will ever come out from. || true
is because wait
's exit status will reflect a SIGALRM delivery which would cause the shell to exit if the errexit
option is set.
In other shells:
mksh
and ksh93
have sleep
built-in, no point in using anything else there (though they both also support read -t
).
zsh
also supports read -t
, but also has a builtin wrapper around select()
, so you can also use:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
If what you want is schedule things to be run from an interactive shell session, see also the zsh/sched
module in zsh
.
Would you considerread -t 10 < /dev/zero || true
?
– Jeff Schaller
2 days ago
5
@JeffSchaller I would avoid it as that's a busy loop.
– Stéphane Chazelas
2 days ago
@StéphaneChazelas I wouldn't expect that to be a busy loop – I'd expect any shell'sread
to be implemented using select(2) or something similar (implying that read-with-timeout would be a good answer to this question). I'm expressing surprise rather than contradicting you, but can you point to further discussion of this?
– Norman Gray
2 days ago
5
@NormanGray,/dev/zero
is a file that contains an infinite amount of data (NUL bytes). Soread
will read as much as it can during those 10 seconds. Thankfully, in the case ofbash
which doesn't support storing NUL bytes in its variables, that won't use up any memory, but that will still hog CPU resources.
– Stéphane Chazelas
2 days ago
1
@NormanGray, if run from a terminal,/dev/stdout
would be the tty device, so it would have side effects (like stopping the script if run in background) and would return if the user presses enter for instance.read -t 10 /dev/stdout | :
would work on Linux, but on Linux only, whilecoproc
should work regardless of the OS.
– Stéphane Chazelas
2 days ago
|
show 1 more comment
up vote
6
down vote
Since there are answers which are suggesting to use the non-standard -t delay
option of read
, here is a way to do a timed-out read in a standard shell:
{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }
The argument to stty time
is in tenths of second.
add a comment |
up vote
5
down vote
Using the bash built-in variable $SECONDS
and a busy-loop:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
2
That would in effect pause for a duration ranging somewhere in between 9 and 10 seconds though (due to a bug inbash
;zsh
andmksh
had similar issues but have been fixed since)
– Stéphane Chazelas
2 days ago
6
A good way to make heat.
– ctrl-alt-delor
2 days ago
6
won't be the first time I'm accused of being full of hot air! :)
– Jeff Schaller
2 days ago
add a comment |
up vote
3
down vote
There is no built-in, that does the same as sleep
(unless sleep
is built-in). However there are some other commands that will wait.
A few include.
at
andcron
: used to schedule tasks at a specific time.inotifywait
: used to wait for a file, or files to be modified/removed/added/etc
Thanks for this. Could you provide an example for performing a scheduled task (10 seconds from now) withat
?
– user321697
2 days ago
1
an edit and an upvote! ;-)
– Fabby
2 days ago
cron
store tasks incrontab
, right? Where doesat
store the scheduled data?
– user321697
2 days ago
@user321697 Already answered here
– Fabby
2 days ago
Sorry for reverting back your edit to the Q: you changed the OPs question's main purpose which would invalidate the simplest answer of all... ¯_(ツ)_/¯
– Fabby
2 days ago
|
show 1 more comment
up vote
3
down vote
Some other ideas.
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
1
You "stole" my idea of timelimit/timeout.... +1
– Rui F Ribeiro
yesterday
add a comment |
up vote
2
down vote
the oldest trick in the book:
read && echo "This is a test"
Just hit Enter and it'll continue!
This wont if the process needs to be run interaction free or in the background right?
– sai sasanka
2 days ago
Correct: But that was not one of the OP's requirements as per the original question, so still a valid answer... ;-) >:-)
– Fabby
yesterday
1
OP specifically gives an example (withsleep
) and asks for an equivalent alternative without. Soread
doesn't parse, sorry. ;)
– AnoE
yesterday
@AnoE Stéphane's answer is of course the best, mine is just the oldest--- press «enter» to continue ---
;-)
– Fabby
yesterday
add a comment |
up vote
2
down vote
Back in the days of microcomputers running BASIC, delays were usually accomplished with an empty loop:
FOR I = 1 TO 10000:NEXT
The same principle could be used to insert a delay in a shell script:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
Of course, the problem with this approach is that the length of the delay will vary from machine to machine according to its processor speed (or even on the same machine under different loads). Unlike sleep
, it will probably also max out your CPU (or one of its cores).
2
A good way to make heat.
– ctrl-alt-delor
2 days ago
1
Delay-loops are a terrible idea for anything except the very shortest of sleeps (a couple nanoseconds or clock cycles in a device driver) on any modern CPU that can run a Unix-like OS. i.e. a sleep so short you can't usefully have the CPU do anything else while waiting, like schedule another process or enter a low-power sleep state before waking on a timer interrupt. Dynamic CPU-frequency makes it impossible to even calibrate a delay loop for counts per second, except as a minimum delay potentially sleeping a lot longer at low clock speeds before ramping up.
– Peter Cordes
2 days ago
Ancient computers had a power consumption that was much less dependent on workload. Modern CPUs need to dynamically power down different parts of the chip as much as possible to not melt (e.g. power down parts of the FPU or SIMD execution units while only integer code is running, or at least gate the clock signal to parts of the chip that don't need to be switching). And entering a low-power sleep state when idle (instead of spinning in an infinite loop waiting for timer interrupts) is also more recent than the ancient computers you mention.
– Peter Cordes
2 days ago
For more about CPU history, see Modern Microprocessors A 90-Minute Guide! - lighterra.com/papers/modernmicroprocessors.
– Peter Cordes
2 days ago
add a comment |
up vote
2
down vote
A classic from the Land of Windows and Batches:
ping -c 11 localhost >/dev/null && echo "This is a test"
New contributor
Firewall or name system misconfiguration might introduce a significant additional delay tough.
– spectras
yesterday
1
127.0.0.1 ... @spectras
– AnoE
yesterday
1
Thankfully no longer needed, as Windows now supports sleep natively.
– Baldrickk
yesterday
1
@AnoE> solves the name system part, not the firewall part. Though not common, it can be configured to silently drop pings on local interface. That will cause ping to wait much longer.
– spectras
yesterday
+1 for the "fond" memories
– A C
yesterday
add a comment |
up vote
0
down vote
If you want to interactively wait for a new line in a file, then
tail -f
.Waiting for a change on a filesystem? Then use e.g.
inotify / inoticoming
.And there are other options, depending on what you mean with "wait".
add a comment |
10 Answers
10
active
oldest
votes
10 Answers
10
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
13
down vote
accepted
You have alternatives to sleep
: They are at
and cron
. Contrary to sleep
these need you to provide the time at which you need them to run.
Make sure the
atd
service is running by executingservice atd status
.
Now let's say the date is 11:17 am UTC; if you need to execute a command at 11:25 UTC, the syntax is:echo "This is a test" | at 11:25
.
Now keep in mind thatatd
by default will not be logging the completion of the jobs. For more refer this link. It's better that your application has its own logging.You can schedule jobs in
cron
, for more refer :man cron
to see its options orcrontab -e
to add new jobs./var/log/cron
can be checked for the info on execution on jobs.
FYI sleep system call
suspends the current execution and schedules it w.r.t. the argument passed to it.
EDIT:
As @Gaius mentioned , you can also add minutes time to at
command.But lets say time is 12:30:30
and now you ran the scheduler with now +1 minutes
. Even though 1 minute, which translates to 60 seconds was specified , the at
doesn't really wait till 12:31:30
to execute the job, rather it executes the job at 12:31:00
. The time-units can be minutes, hours, days, or weeks
. For more refer man at
e.g: echo "ls" | at now +1 minutes
6
This is not true, you can schedule an at job for say now +1 minute, to run in a minutes time
– Gaius
2 days ago
add a comment |
up vote
13
down vote
accepted
You have alternatives to sleep
: They are at
and cron
. Contrary to sleep
these need you to provide the time at which you need them to run.
Make sure the
atd
service is running by executingservice atd status
.
Now let's say the date is 11:17 am UTC; if you need to execute a command at 11:25 UTC, the syntax is:echo "This is a test" | at 11:25
.
Now keep in mind thatatd
by default will not be logging the completion of the jobs. For more refer this link. It's better that your application has its own logging.You can schedule jobs in
cron
, for more refer :man cron
to see its options orcrontab -e
to add new jobs./var/log/cron
can be checked for the info on execution on jobs.
FYI sleep system call
suspends the current execution and schedules it w.r.t. the argument passed to it.
EDIT:
As @Gaius mentioned , you can also add minutes time to at
command.But lets say time is 12:30:30
and now you ran the scheduler with now +1 minutes
. Even though 1 minute, which translates to 60 seconds was specified , the at
doesn't really wait till 12:31:30
to execute the job, rather it executes the job at 12:31:00
. The time-units can be minutes, hours, days, or weeks
. For more refer man at
e.g: echo "ls" | at now +1 minutes
6
This is not true, you can schedule an at job for say now +1 minute, to run in a minutes time
– Gaius
2 days ago
add a comment |
up vote
13
down vote
accepted
up vote
13
down vote
accepted
You have alternatives to sleep
: They are at
and cron
. Contrary to sleep
these need you to provide the time at which you need them to run.
Make sure the
atd
service is running by executingservice atd status
.
Now let's say the date is 11:17 am UTC; if you need to execute a command at 11:25 UTC, the syntax is:echo "This is a test" | at 11:25
.
Now keep in mind thatatd
by default will not be logging the completion of the jobs. For more refer this link. It's better that your application has its own logging.You can schedule jobs in
cron
, for more refer :man cron
to see its options orcrontab -e
to add new jobs./var/log/cron
can be checked for the info on execution on jobs.
FYI sleep system call
suspends the current execution and schedules it w.r.t. the argument passed to it.
EDIT:
As @Gaius mentioned , you can also add minutes time to at
command.But lets say time is 12:30:30
and now you ran the scheduler with now +1 minutes
. Even though 1 minute, which translates to 60 seconds was specified , the at
doesn't really wait till 12:31:30
to execute the job, rather it executes the job at 12:31:00
. The time-units can be minutes, hours, days, or weeks
. For more refer man at
e.g: echo "ls" | at now +1 minutes
You have alternatives to sleep
: They are at
and cron
. Contrary to sleep
these need you to provide the time at which you need them to run.
Make sure the
atd
service is running by executingservice atd status
.
Now let's say the date is 11:17 am UTC; if you need to execute a command at 11:25 UTC, the syntax is:echo "This is a test" | at 11:25
.
Now keep in mind thatatd
by default will not be logging the completion of the jobs. For more refer this link. It's better that your application has its own logging.You can schedule jobs in
cron
, for more refer :man cron
to see its options orcrontab -e
to add new jobs./var/log/cron
can be checked for the info on execution on jobs.
FYI sleep system call
suspends the current execution and schedules it w.r.t. the argument passed to it.
EDIT:
As @Gaius mentioned , you can also add minutes time to at
command.But lets say time is 12:30:30
and now you ran the scheduler with now +1 minutes
. Even though 1 minute, which translates to 60 seconds was specified , the at
doesn't really wait till 12:31:30
to execute the job, rather it executes the job at 12:31:00
. The time-units can be minutes, hours, days, or weeks
. For more refer man at
e.g: echo "ls" | at now +1 minutes
edited 2 days ago
answered 2 days ago
sai sasanka
699110
699110
6
This is not true, you can schedule an at job for say now +1 minute, to run in a minutes time
– Gaius
2 days ago
add a comment |
6
This is not true, you can schedule an at job for say now +1 minute, to run in a minutes time
– Gaius
2 days ago
6
6
This is not true, you can schedule an at job for say now +1 minute, to run in a minutes time
– Gaius
2 days ago
This is not true, you can schedule an at job for say now +1 minute, to run in a minutes time
– Gaius
2 days ago
add a comment |
up vote
25
down vote
With bash
builtins, you can do:
coproc read -t 10 && wait "$!" || true
To sleep for 10 seconds without using sleep
. The coproc
is to make so that read
's stdin is a pipe where nothing will ever come out from. || true
is because wait
's exit status will reflect a SIGALRM delivery which would cause the shell to exit if the errexit
option is set.
In other shells:
mksh
and ksh93
have sleep
built-in, no point in using anything else there (though they both also support read -t
).
zsh
also supports read -t
, but also has a builtin wrapper around select()
, so you can also use:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
If what you want is schedule things to be run from an interactive shell session, see also the zsh/sched
module in zsh
.
Would you considerread -t 10 < /dev/zero || true
?
– Jeff Schaller
2 days ago
5
@JeffSchaller I would avoid it as that's a busy loop.
– Stéphane Chazelas
2 days ago
@StéphaneChazelas I wouldn't expect that to be a busy loop – I'd expect any shell'sread
to be implemented using select(2) or something similar (implying that read-with-timeout would be a good answer to this question). I'm expressing surprise rather than contradicting you, but can you point to further discussion of this?
– Norman Gray
2 days ago
5
@NormanGray,/dev/zero
is a file that contains an infinite amount of data (NUL bytes). Soread
will read as much as it can during those 10 seconds. Thankfully, in the case ofbash
which doesn't support storing NUL bytes in its variables, that won't use up any memory, but that will still hog CPU resources.
– Stéphane Chazelas
2 days ago
1
@NormanGray, if run from a terminal,/dev/stdout
would be the tty device, so it would have side effects (like stopping the script if run in background) and would return if the user presses enter for instance.read -t 10 /dev/stdout | :
would work on Linux, but on Linux only, whilecoproc
should work regardless of the OS.
– Stéphane Chazelas
2 days ago
|
show 1 more comment
up vote
25
down vote
With bash
builtins, you can do:
coproc read -t 10 && wait "$!" || true
To sleep for 10 seconds without using sleep
. The coproc
is to make so that read
's stdin is a pipe where nothing will ever come out from. || true
is because wait
's exit status will reflect a SIGALRM delivery which would cause the shell to exit if the errexit
option is set.
In other shells:
mksh
and ksh93
have sleep
built-in, no point in using anything else there (though they both also support read -t
).
zsh
also supports read -t
, but also has a builtin wrapper around select()
, so you can also use:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
If what you want is schedule things to be run from an interactive shell session, see also the zsh/sched
module in zsh
.
Would you considerread -t 10 < /dev/zero || true
?
– Jeff Schaller
2 days ago
5
@JeffSchaller I would avoid it as that's a busy loop.
– Stéphane Chazelas
2 days ago
@StéphaneChazelas I wouldn't expect that to be a busy loop – I'd expect any shell'sread
to be implemented using select(2) or something similar (implying that read-with-timeout would be a good answer to this question). I'm expressing surprise rather than contradicting you, but can you point to further discussion of this?
– Norman Gray
2 days ago
5
@NormanGray,/dev/zero
is a file that contains an infinite amount of data (NUL bytes). Soread
will read as much as it can during those 10 seconds. Thankfully, in the case ofbash
which doesn't support storing NUL bytes in its variables, that won't use up any memory, but that will still hog CPU resources.
– Stéphane Chazelas
2 days ago
1
@NormanGray, if run from a terminal,/dev/stdout
would be the tty device, so it would have side effects (like stopping the script if run in background) and would return if the user presses enter for instance.read -t 10 /dev/stdout | :
would work on Linux, but on Linux only, whilecoproc
should work regardless of the OS.
– Stéphane Chazelas
2 days ago
|
show 1 more comment
up vote
25
down vote
up vote
25
down vote
With bash
builtins, you can do:
coproc read -t 10 && wait "$!" || true
To sleep for 10 seconds without using sleep
. The coproc
is to make so that read
's stdin is a pipe where nothing will ever come out from. || true
is because wait
's exit status will reflect a SIGALRM delivery which would cause the shell to exit if the errexit
option is set.
In other shells:
mksh
and ksh93
have sleep
built-in, no point in using anything else there (though they both also support read -t
).
zsh
also supports read -t
, but also has a builtin wrapper around select()
, so you can also use:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
If what you want is schedule things to be run from an interactive shell session, see also the zsh/sched
module in zsh
.
With bash
builtins, you can do:
coproc read -t 10 && wait "$!" || true
To sleep for 10 seconds without using sleep
. The coproc
is to make so that read
's stdin is a pipe where nothing will ever come out from. || true
is because wait
's exit status will reflect a SIGALRM delivery which would cause the shell to exit if the errexit
option is set.
In other shells:
mksh
and ksh93
have sleep
built-in, no point in using anything else there (though they both also support read -t
).
zsh
also supports read -t
, but also has a builtin wrapper around select()
, so you can also use:
zmodload zsh/zselect
zselect -t 1000 # centiseconds
If what you want is schedule things to be run from an interactive shell session, see also the zsh/sched
module in zsh
.
edited 2 days ago
answered 2 days ago
Stéphane Chazelas
294k54553894
294k54553894
Would you considerread -t 10 < /dev/zero || true
?
– Jeff Schaller
2 days ago
5
@JeffSchaller I would avoid it as that's a busy loop.
– Stéphane Chazelas
2 days ago
@StéphaneChazelas I wouldn't expect that to be a busy loop – I'd expect any shell'sread
to be implemented using select(2) or something similar (implying that read-with-timeout would be a good answer to this question). I'm expressing surprise rather than contradicting you, but can you point to further discussion of this?
– Norman Gray
2 days ago
5
@NormanGray,/dev/zero
is a file that contains an infinite amount of data (NUL bytes). Soread
will read as much as it can during those 10 seconds. Thankfully, in the case ofbash
which doesn't support storing NUL bytes in its variables, that won't use up any memory, but that will still hog CPU resources.
– Stéphane Chazelas
2 days ago
1
@NormanGray, if run from a terminal,/dev/stdout
would be the tty device, so it would have side effects (like stopping the script if run in background) and would return if the user presses enter for instance.read -t 10 /dev/stdout | :
would work on Linux, but on Linux only, whilecoproc
should work regardless of the OS.
– Stéphane Chazelas
2 days ago
|
show 1 more comment
Would you considerread -t 10 < /dev/zero || true
?
– Jeff Schaller
2 days ago
5
@JeffSchaller I would avoid it as that's a busy loop.
– Stéphane Chazelas
2 days ago
@StéphaneChazelas I wouldn't expect that to be a busy loop – I'd expect any shell'sread
to be implemented using select(2) or something similar (implying that read-with-timeout would be a good answer to this question). I'm expressing surprise rather than contradicting you, but can you point to further discussion of this?
– Norman Gray
2 days ago
5
@NormanGray,/dev/zero
is a file that contains an infinite amount of data (NUL bytes). Soread
will read as much as it can during those 10 seconds. Thankfully, in the case ofbash
which doesn't support storing NUL bytes in its variables, that won't use up any memory, but that will still hog CPU resources.
– Stéphane Chazelas
2 days ago
1
@NormanGray, if run from a terminal,/dev/stdout
would be the tty device, so it would have side effects (like stopping the script if run in background) and would return if the user presses enter for instance.read -t 10 /dev/stdout | :
would work on Linux, but on Linux only, whilecoproc
should work regardless of the OS.
– Stéphane Chazelas
2 days ago
Would you consider
read -t 10 < /dev/zero || true
?– Jeff Schaller
2 days ago
Would you consider
read -t 10 < /dev/zero || true
?– Jeff Schaller
2 days ago
5
5
@JeffSchaller I would avoid it as that's a busy loop.
– Stéphane Chazelas
2 days ago
@JeffSchaller I would avoid it as that's a busy loop.
– Stéphane Chazelas
2 days ago
@StéphaneChazelas I wouldn't expect that to be a busy loop – I'd expect any shell's
read
to be implemented using select(2) or something similar (implying that read-with-timeout would be a good answer to this question). I'm expressing surprise rather than contradicting you, but can you point to further discussion of this?– Norman Gray
2 days ago
@StéphaneChazelas I wouldn't expect that to be a busy loop – I'd expect any shell's
read
to be implemented using select(2) or something similar (implying that read-with-timeout would be a good answer to this question). I'm expressing surprise rather than contradicting you, but can you point to further discussion of this?– Norman Gray
2 days ago
5
5
@NormanGray,
/dev/zero
is a file that contains an infinite amount of data (NUL bytes). So read
will read as much as it can during those 10 seconds. Thankfully, in the case of bash
which doesn't support storing NUL bytes in its variables, that won't use up any memory, but that will still hog CPU resources.– Stéphane Chazelas
2 days ago
@NormanGray,
/dev/zero
is a file that contains an infinite amount of data (NUL bytes). So read
will read as much as it can during those 10 seconds. Thankfully, in the case of bash
which doesn't support storing NUL bytes in its variables, that won't use up any memory, but that will still hog CPU resources.– Stéphane Chazelas
2 days ago
1
1
@NormanGray, if run from a terminal,
/dev/stdout
would be the tty device, so it would have side effects (like stopping the script if run in background) and would return if the user presses enter for instance. read -t 10 /dev/stdout | :
would work on Linux, but on Linux only, while coproc
should work regardless of the OS.– Stéphane Chazelas
2 days ago
@NormanGray, if run from a terminal,
/dev/stdout
would be the tty device, so it would have side effects (like stopping the script if run in background) and would return if the user presses enter for instance. read -t 10 /dev/stdout | :
would work on Linux, but on Linux only, while coproc
should work regardless of the OS.– Stéphane Chazelas
2 days ago
|
show 1 more comment
up vote
6
down vote
Since there are answers which are suggesting to use the non-standard -t delay
option of read
, here is a way to do a timed-out read in a standard shell:
{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }
The argument to stty time
is in tenths of second.
add a comment |
up vote
6
down vote
Since there are answers which are suggesting to use the non-standard -t delay
option of read
, here is a way to do a timed-out read in a standard shell:
{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }
The argument to stty time
is in tenths of second.
add a comment |
up vote
6
down vote
up vote
6
down vote
Since there are answers which are suggesting to use the non-standard -t delay
option of read
, here is a way to do a timed-out read in a standard shell:
{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }
The argument to stty time
is in tenths of second.
Since there are answers which are suggesting to use the non-standard -t delay
option of read
, here is a way to do a timed-out read in a standard shell:
{ ss=`stty -g`; stty -icanon min 0 time 20; read foo; stty "$ss"; }
The argument to stty time
is in tenths of second.
answered 2 days ago
mosvy
4,333321
4,333321
add a comment |
add a comment |
up vote
5
down vote
Using the bash built-in variable $SECONDS
and a busy-loop:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
2
That would in effect pause for a duration ranging somewhere in between 9 and 10 seconds though (due to a bug inbash
;zsh
andmksh
had similar issues but have been fixed since)
– Stéphane Chazelas
2 days ago
6
A good way to make heat.
– ctrl-alt-delor
2 days ago
6
won't be the first time I'm accused of being full of hot air! :)
– Jeff Schaller
2 days ago
add a comment |
up vote
5
down vote
Using the bash built-in variable $SECONDS
and a busy-loop:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
2
That would in effect pause for a duration ranging somewhere in between 9 and 10 seconds though (due to a bug inbash
;zsh
andmksh
had similar issues but have been fixed since)
– Stéphane Chazelas
2 days ago
6
A good way to make heat.
– ctrl-alt-delor
2 days ago
6
won't be the first time I'm accused of being full of hot air! :)
– Jeff Schaller
2 days ago
add a comment |
up vote
5
down vote
up vote
5
down vote
Using the bash built-in variable $SECONDS
and a busy-loop:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
Using the bash built-in variable $SECONDS
and a busy-loop:
for((target=$((SECONDS + 10)); SECONDS < target; true)); do :; done
answered 2 days ago
Jeff Schaller
36.3k952119
36.3k952119
2
That would in effect pause for a duration ranging somewhere in between 9 and 10 seconds though (due to a bug inbash
;zsh
andmksh
had similar issues but have been fixed since)
– Stéphane Chazelas
2 days ago
6
A good way to make heat.
– ctrl-alt-delor
2 days ago
6
won't be the first time I'm accused of being full of hot air! :)
– Jeff Schaller
2 days ago
add a comment |
2
That would in effect pause for a duration ranging somewhere in between 9 and 10 seconds though (due to a bug inbash
;zsh
andmksh
had similar issues but have been fixed since)
– Stéphane Chazelas
2 days ago
6
A good way to make heat.
– ctrl-alt-delor
2 days ago
6
won't be the first time I'm accused of being full of hot air! :)
– Jeff Schaller
2 days ago
2
2
That would in effect pause for a duration ranging somewhere in between 9 and 10 seconds though (due to a bug in
bash
; zsh
and mksh
had similar issues but have been fixed since)– Stéphane Chazelas
2 days ago
That would in effect pause for a duration ranging somewhere in between 9 and 10 seconds though (due to a bug in
bash
; zsh
and mksh
had similar issues but have been fixed since)– Stéphane Chazelas
2 days ago
6
6
A good way to make heat.
– ctrl-alt-delor
2 days ago
A good way to make heat.
– ctrl-alt-delor
2 days ago
6
6
won't be the first time I'm accused of being full of hot air! :)
– Jeff Schaller
2 days ago
won't be the first time I'm accused of being full of hot air! :)
– Jeff Schaller
2 days ago
add a comment |
up vote
3
down vote
There is no built-in, that does the same as sleep
(unless sleep
is built-in). However there are some other commands that will wait.
A few include.
at
andcron
: used to schedule tasks at a specific time.inotifywait
: used to wait for a file, or files to be modified/removed/added/etc
Thanks for this. Could you provide an example for performing a scheduled task (10 seconds from now) withat
?
– user321697
2 days ago
1
an edit and an upvote! ;-)
– Fabby
2 days ago
cron
store tasks incrontab
, right? Where doesat
store the scheduled data?
– user321697
2 days ago
@user321697 Already answered here
– Fabby
2 days ago
Sorry for reverting back your edit to the Q: you changed the OPs question's main purpose which would invalidate the simplest answer of all... ¯_(ツ)_/¯
– Fabby
2 days ago
|
show 1 more comment
up vote
3
down vote
There is no built-in, that does the same as sleep
(unless sleep
is built-in). However there are some other commands that will wait.
A few include.
at
andcron
: used to schedule tasks at a specific time.inotifywait
: used to wait for a file, or files to be modified/removed/added/etc
Thanks for this. Could you provide an example for performing a scheduled task (10 seconds from now) withat
?
– user321697
2 days ago
1
an edit and an upvote! ;-)
– Fabby
2 days ago
cron
store tasks incrontab
, right? Where doesat
store the scheduled data?
– user321697
2 days ago
@user321697 Already answered here
– Fabby
2 days ago
Sorry for reverting back your edit to the Q: you changed the OPs question's main purpose which would invalidate the simplest answer of all... ¯_(ツ)_/¯
– Fabby
2 days ago
|
show 1 more comment
up vote
3
down vote
up vote
3
down vote
There is no built-in, that does the same as sleep
(unless sleep
is built-in). However there are some other commands that will wait.
A few include.
at
andcron
: used to schedule tasks at a specific time.inotifywait
: used to wait for a file, or files to be modified/removed/added/etc
There is no built-in, that does the same as sleep
(unless sleep
is built-in). However there are some other commands that will wait.
A few include.
at
andcron
: used to schedule tasks at a specific time.inotifywait
: used to wait for a file, or files to be modified/removed/added/etc
edited 2 days ago
Fabby
3,04411126
3,04411126
answered 2 days ago
ctrl-alt-delor
10k41955
10k41955
Thanks for this. Could you provide an example for performing a scheduled task (10 seconds from now) withat
?
– user321697
2 days ago
1
an edit and an upvote! ;-)
– Fabby
2 days ago
cron
store tasks incrontab
, right? Where doesat
store the scheduled data?
– user321697
2 days ago
@user321697 Already answered here
– Fabby
2 days ago
Sorry for reverting back your edit to the Q: you changed the OPs question's main purpose which would invalidate the simplest answer of all... ¯_(ツ)_/¯
– Fabby
2 days ago
|
show 1 more comment
Thanks for this. Could you provide an example for performing a scheduled task (10 seconds from now) withat
?
– user321697
2 days ago
1
an edit and an upvote! ;-)
– Fabby
2 days ago
cron
store tasks incrontab
, right? Where doesat
store the scheduled data?
– user321697
2 days ago
@user321697 Already answered here
– Fabby
2 days ago
Sorry for reverting back your edit to the Q: you changed the OPs question's main purpose which would invalidate the simplest answer of all... ¯_(ツ)_/¯
– Fabby
2 days ago
Thanks for this. Could you provide an example for performing a scheduled task (10 seconds from now) with
at
?– user321697
2 days ago
Thanks for this. Could you provide an example for performing a scheduled task (10 seconds from now) with
at
?– user321697
2 days ago
1
1
an edit and an upvote! ;-)
– Fabby
2 days ago
an edit and an upvote! ;-)
– Fabby
2 days ago
cron
store tasks in crontab
, right? Where does at
store the scheduled data?– user321697
2 days ago
cron
store tasks in crontab
, right? Where does at
store the scheduled data?– user321697
2 days ago
@user321697 Already answered here
– Fabby
2 days ago
@user321697 Already answered here
– Fabby
2 days ago
Sorry for reverting back your edit to the Q: you changed the OPs question's main purpose which would invalidate the simplest answer of all... ¯_(ツ)_/¯
– Fabby
2 days ago
Sorry for reverting back your edit to the Q: you changed the OPs question's main purpose which would invalidate the simplest answer of all... ¯_(ツ)_/¯
– Fabby
2 days ago
|
show 1 more comment
up vote
3
down vote
Some other ideas.
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
1
You "stole" my idea of timelimit/timeout.... +1
– Rui F Ribeiro
yesterday
add a comment |
up vote
3
down vote
Some other ideas.
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
1
You "stole" my idea of timelimit/timeout.... +1
– Rui F Ribeiro
yesterday
add a comment |
up vote
3
down vote
up vote
3
down vote
Some other ideas.
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
Some other ideas.
top -d10 -n2 >/dev/null
vmstat 10 2 >/dev/null
sar 10 1 >/dev/null
timeout 10s tail -f /dev/null
answered 2 days ago
steve
13.7k22452
13.7k22452
1
You "stole" my idea of timelimit/timeout.... +1
– Rui F Ribeiro
yesterday
add a comment |
1
You "stole" my idea of timelimit/timeout.... +1
– Rui F Ribeiro
yesterday
1
1
You "stole" my idea of timelimit/timeout.... +1
– Rui F Ribeiro
yesterday
You "stole" my idea of timelimit/timeout.... +1
– Rui F Ribeiro
yesterday
add a comment |
up vote
2
down vote
the oldest trick in the book:
read && echo "This is a test"
Just hit Enter and it'll continue!
This wont if the process needs to be run interaction free or in the background right?
– sai sasanka
2 days ago
Correct: But that was not one of the OP's requirements as per the original question, so still a valid answer... ;-) >:-)
– Fabby
yesterday
1
OP specifically gives an example (withsleep
) and asks for an equivalent alternative without. Soread
doesn't parse, sorry. ;)
– AnoE
yesterday
@AnoE Stéphane's answer is of course the best, mine is just the oldest--- press «enter» to continue ---
;-)
– Fabby
yesterday
add a comment |
up vote
2
down vote
the oldest trick in the book:
read && echo "This is a test"
Just hit Enter and it'll continue!
This wont if the process needs to be run interaction free or in the background right?
– sai sasanka
2 days ago
Correct: But that was not one of the OP's requirements as per the original question, so still a valid answer... ;-) >:-)
– Fabby
yesterday
1
OP specifically gives an example (withsleep
) and asks for an equivalent alternative without. Soread
doesn't parse, sorry. ;)
– AnoE
yesterday
@AnoE Stéphane's answer is of course the best, mine is just the oldest--- press «enter» to continue ---
;-)
– Fabby
yesterday
add a comment |
up vote
2
down vote
up vote
2
down vote
the oldest trick in the book:
read && echo "This is a test"
Just hit Enter and it'll continue!
the oldest trick in the book:
read && echo "This is a test"
Just hit Enter and it'll continue!
answered 2 days ago
Fabby
3,04411126
3,04411126
This wont if the process needs to be run interaction free or in the background right?
– sai sasanka
2 days ago
Correct: But that was not one of the OP's requirements as per the original question, so still a valid answer... ;-) >:-)
– Fabby
yesterday
1
OP specifically gives an example (withsleep
) and asks for an equivalent alternative without. Soread
doesn't parse, sorry. ;)
– AnoE
yesterday
@AnoE Stéphane's answer is of course the best, mine is just the oldest--- press «enter» to continue ---
;-)
– Fabby
yesterday
add a comment |
This wont if the process needs to be run interaction free or in the background right?
– sai sasanka
2 days ago
Correct: But that was not one of the OP's requirements as per the original question, so still a valid answer... ;-) >:-)
– Fabby
yesterday
1
OP specifically gives an example (withsleep
) and asks for an equivalent alternative without. Soread
doesn't parse, sorry. ;)
– AnoE
yesterday
@AnoE Stéphane's answer is of course the best, mine is just the oldest--- press «enter» to continue ---
;-)
– Fabby
yesterday
This wont if the process needs to be run interaction free or in the background right?
– sai sasanka
2 days ago
This wont if the process needs to be run interaction free or in the background right?
– sai sasanka
2 days ago
Correct: But that was not one of the OP's requirements as per the original question, so still a valid answer... ;-) >:-)
– Fabby
yesterday
Correct: But that was not one of the OP's requirements as per the original question, so still a valid answer... ;-) >:-)
– Fabby
yesterday
1
1
OP specifically gives an example (with
sleep
) and asks for an equivalent alternative without. So read
doesn't parse, sorry. ;)– AnoE
yesterday
OP specifically gives an example (with
sleep
) and asks for an equivalent alternative without. So read
doesn't parse, sorry. ;)– AnoE
yesterday
@AnoE Stéphane's answer is of course the best, mine is just the oldest
--- press «enter» to continue ---
;-)– Fabby
yesterday
@AnoE Stéphane's answer is of course the best, mine is just the oldest
--- press «enter» to continue ---
;-)– Fabby
yesterday
add a comment |
up vote
2
down vote
Back in the days of microcomputers running BASIC, delays were usually accomplished with an empty loop:
FOR I = 1 TO 10000:NEXT
The same principle could be used to insert a delay in a shell script:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
Of course, the problem with this approach is that the length of the delay will vary from machine to machine according to its processor speed (or even on the same machine under different loads). Unlike sleep
, it will probably also max out your CPU (or one of its cores).
2
A good way to make heat.
– ctrl-alt-delor
2 days ago
1
Delay-loops are a terrible idea for anything except the very shortest of sleeps (a couple nanoseconds or clock cycles in a device driver) on any modern CPU that can run a Unix-like OS. i.e. a sleep so short you can't usefully have the CPU do anything else while waiting, like schedule another process or enter a low-power sleep state before waking on a timer interrupt. Dynamic CPU-frequency makes it impossible to even calibrate a delay loop for counts per second, except as a minimum delay potentially sleeping a lot longer at low clock speeds before ramping up.
– Peter Cordes
2 days ago
Ancient computers had a power consumption that was much less dependent on workload. Modern CPUs need to dynamically power down different parts of the chip as much as possible to not melt (e.g. power down parts of the FPU or SIMD execution units while only integer code is running, or at least gate the clock signal to parts of the chip that don't need to be switching). And entering a low-power sleep state when idle (instead of spinning in an infinite loop waiting for timer interrupts) is also more recent than the ancient computers you mention.
– Peter Cordes
2 days ago
For more about CPU history, see Modern Microprocessors A 90-Minute Guide! - lighterra.com/papers/modernmicroprocessors.
– Peter Cordes
2 days ago
add a comment |
up vote
2
down vote
Back in the days of microcomputers running BASIC, delays were usually accomplished with an empty loop:
FOR I = 1 TO 10000:NEXT
The same principle could be used to insert a delay in a shell script:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
Of course, the problem with this approach is that the length of the delay will vary from machine to machine according to its processor speed (or even on the same machine under different loads). Unlike sleep
, it will probably also max out your CPU (or one of its cores).
2
A good way to make heat.
– ctrl-alt-delor
2 days ago
1
Delay-loops are a terrible idea for anything except the very shortest of sleeps (a couple nanoseconds or clock cycles in a device driver) on any modern CPU that can run a Unix-like OS. i.e. a sleep so short you can't usefully have the CPU do anything else while waiting, like schedule another process or enter a low-power sleep state before waking on a timer interrupt. Dynamic CPU-frequency makes it impossible to even calibrate a delay loop for counts per second, except as a minimum delay potentially sleeping a lot longer at low clock speeds before ramping up.
– Peter Cordes
2 days ago
Ancient computers had a power consumption that was much less dependent on workload. Modern CPUs need to dynamically power down different parts of the chip as much as possible to not melt (e.g. power down parts of the FPU or SIMD execution units while only integer code is running, or at least gate the clock signal to parts of the chip that don't need to be switching). And entering a low-power sleep state when idle (instead of spinning in an infinite loop waiting for timer interrupts) is also more recent than the ancient computers you mention.
– Peter Cordes
2 days ago
For more about CPU history, see Modern Microprocessors A 90-Minute Guide! - lighterra.com/papers/modernmicroprocessors.
– Peter Cordes
2 days ago
add a comment |
up vote
2
down vote
up vote
2
down vote
Back in the days of microcomputers running BASIC, delays were usually accomplished with an empty loop:
FOR I = 1 TO 10000:NEXT
The same principle could be used to insert a delay in a shell script:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
Of course, the problem with this approach is that the length of the delay will vary from machine to machine according to its processor speed (or even on the same machine under different loads). Unlike sleep
, it will probably also max out your CPU (or one of its cores).
Back in the days of microcomputers running BASIC, delays were usually accomplished with an empty loop:
FOR I = 1 TO 10000:NEXT
The same principle could be used to insert a delay in a shell script:
COUNTER=0; while [ $COUNTER -lt 10000 ]; do :; let COUNTER=COUNTER+1; done
Of course, the problem with this approach is that the length of the delay will vary from machine to machine according to its processor speed (or even on the same machine under different loads). Unlike sleep
, it will probably also max out your CPU (or one of its cores).
answered 2 days ago
Psychonaut
314212
314212
2
A good way to make heat.
– ctrl-alt-delor
2 days ago
1
Delay-loops are a terrible idea for anything except the very shortest of sleeps (a couple nanoseconds or clock cycles in a device driver) on any modern CPU that can run a Unix-like OS. i.e. a sleep so short you can't usefully have the CPU do anything else while waiting, like schedule another process or enter a low-power sleep state before waking on a timer interrupt. Dynamic CPU-frequency makes it impossible to even calibrate a delay loop for counts per second, except as a minimum delay potentially sleeping a lot longer at low clock speeds before ramping up.
– Peter Cordes
2 days ago
Ancient computers had a power consumption that was much less dependent on workload. Modern CPUs need to dynamically power down different parts of the chip as much as possible to not melt (e.g. power down parts of the FPU or SIMD execution units while only integer code is running, or at least gate the clock signal to parts of the chip that don't need to be switching). And entering a low-power sleep state when idle (instead of spinning in an infinite loop waiting for timer interrupts) is also more recent than the ancient computers you mention.
– Peter Cordes
2 days ago
For more about CPU history, see Modern Microprocessors A 90-Minute Guide! - lighterra.com/papers/modernmicroprocessors.
– Peter Cordes
2 days ago
add a comment |
2
A good way to make heat.
– ctrl-alt-delor
2 days ago
1
Delay-loops are a terrible idea for anything except the very shortest of sleeps (a couple nanoseconds or clock cycles in a device driver) on any modern CPU that can run a Unix-like OS. i.e. a sleep so short you can't usefully have the CPU do anything else while waiting, like schedule another process or enter a low-power sleep state before waking on a timer interrupt. Dynamic CPU-frequency makes it impossible to even calibrate a delay loop for counts per second, except as a minimum delay potentially sleeping a lot longer at low clock speeds before ramping up.
– Peter Cordes
2 days ago
Ancient computers had a power consumption that was much less dependent on workload. Modern CPUs need to dynamically power down different parts of the chip as much as possible to not melt (e.g. power down parts of the FPU or SIMD execution units while only integer code is running, or at least gate the clock signal to parts of the chip that don't need to be switching). And entering a low-power sleep state when idle (instead of spinning in an infinite loop waiting for timer interrupts) is also more recent than the ancient computers you mention.
– Peter Cordes
2 days ago
For more about CPU history, see Modern Microprocessors A 90-Minute Guide! - lighterra.com/papers/modernmicroprocessors.
– Peter Cordes
2 days ago
2
2
A good way to make heat.
– ctrl-alt-delor
2 days ago
A good way to make heat.
– ctrl-alt-delor
2 days ago
1
1
Delay-loops are a terrible idea for anything except the very shortest of sleeps (a couple nanoseconds or clock cycles in a device driver) on any modern CPU that can run a Unix-like OS. i.e. a sleep so short you can't usefully have the CPU do anything else while waiting, like schedule another process or enter a low-power sleep state before waking on a timer interrupt. Dynamic CPU-frequency makes it impossible to even calibrate a delay loop for counts per second, except as a minimum delay potentially sleeping a lot longer at low clock speeds before ramping up.
– Peter Cordes
2 days ago
Delay-loops are a terrible idea for anything except the very shortest of sleeps (a couple nanoseconds or clock cycles in a device driver) on any modern CPU that can run a Unix-like OS. i.e. a sleep so short you can't usefully have the CPU do anything else while waiting, like schedule another process or enter a low-power sleep state before waking on a timer interrupt. Dynamic CPU-frequency makes it impossible to even calibrate a delay loop for counts per second, except as a minimum delay potentially sleeping a lot longer at low clock speeds before ramping up.
– Peter Cordes
2 days ago
Ancient computers had a power consumption that was much less dependent on workload. Modern CPUs need to dynamically power down different parts of the chip as much as possible to not melt (e.g. power down parts of the FPU or SIMD execution units while only integer code is running, or at least gate the clock signal to parts of the chip that don't need to be switching). And entering a low-power sleep state when idle (instead of spinning in an infinite loop waiting for timer interrupts) is also more recent than the ancient computers you mention.
– Peter Cordes
2 days ago
Ancient computers had a power consumption that was much less dependent on workload. Modern CPUs need to dynamically power down different parts of the chip as much as possible to not melt (e.g. power down parts of the FPU or SIMD execution units while only integer code is running, or at least gate the clock signal to parts of the chip that don't need to be switching). And entering a low-power sleep state when idle (instead of spinning in an infinite loop waiting for timer interrupts) is also more recent than the ancient computers you mention.
– Peter Cordes
2 days ago
For more about CPU history, see Modern Microprocessors A 90-Minute Guide! - lighterra.com/papers/modernmicroprocessors.
– Peter Cordes
2 days ago
For more about CPU history, see Modern Microprocessors A 90-Minute Guide! - lighterra.com/papers/modernmicroprocessors.
– Peter Cordes
2 days ago
add a comment |
up vote
2
down vote
A classic from the Land of Windows and Batches:
ping -c 11 localhost >/dev/null && echo "This is a test"
New contributor
Firewall or name system misconfiguration might introduce a significant additional delay tough.
– spectras
yesterday
1
127.0.0.1 ... @spectras
– AnoE
yesterday
1
Thankfully no longer needed, as Windows now supports sleep natively.
– Baldrickk
yesterday
1
@AnoE> solves the name system part, not the firewall part. Though not common, it can be configured to silently drop pings on local interface. That will cause ping to wait much longer.
– spectras
yesterday
+1 for the "fond" memories
– A C
yesterday
add a comment |
up vote
2
down vote
A classic from the Land of Windows and Batches:
ping -c 11 localhost >/dev/null && echo "This is a test"
New contributor
Firewall or name system misconfiguration might introduce a significant additional delay tough.
– spectras
yesterday
1
127.0.0.1 ... @spectras
– AnoE
yesterday
1
Thankfully no longer needed, as Windows now supports sleep natively.
– Baldrickk
yesterday
1
@AnoE> solves the name system part, not the firewall part. Though not common, it can be configured to silently drop pings on local interface. That will cause ping to wait much longer.
– spectras
yesterday
+1 for the "fond" memories
– A C
yesterday
add a comment |
up vote
2
down vote
up vote
2
down vote
A classic from the Land of Windows and Batches:
ping -c 11 localhost >/dev/null && echo "This is a test"
New contributor
A classic from the Land of Windows and Batches:
ping -c 11 localhost >/dev/null && echo "This is a test"
New contributor
New contributor
answered yesterday
Joker_vD
1211
1211
New contributor
New contributor
Firewall or name system misconfiguration might introduce a significant additional delay tough.
– spectras
yesterday
1
127.0.0.1 ... @spectras
– AnoE
yesterday
1
Thankfully no longer needed, as Windows now supports sleep natively.
– Baldrickk
yesterday
1
@AnoE> solves the name system part, not the firewall part. Though not common, it can be configured to silently drop pings on local interface. That will cause ping to wait much longer.
– spectras
yesterday
+1 for the "fond" memories
– A C
yesterday
add a comment |
Firewall or name system misconfiguration might introduce a significant additional delay tough.
– spectras
yesterday
1
127.0.0.1 ... @spectras
– AnoE
yesterday
1
Thankfully no longer needed, as Windows now supports sleep natively.
– Baldrickk
yesterday
1
@AnoE> solves the name system part, not the firewall part. Though not common, it can be configured to silently drop pings on local interface. That will cause ping to wait much longer.
– spectras
yesterday
+1 for the "fond" memories
– A C
yesterday
Firewall or name system misconfiguration might introduce a significant additional delay tough.
– spectras
yesterday
Firewall or name system misconfiguration might introduce a significant additional delay tough.
– spectras
yesterday
1
1
127.0.0.1 ... @spectras
– AnoE
yesterday
127.0.0.1 ... @spectras
– AnoE
yesterday
1
1
Thankfully no longer needed, as Windows now supports sleep natively.
– Baldrickk
yesterday
Thankfully no longer needed, as Windows now supports sleep natively.
– Baldrickk
yesterday
1
1
@AnoE> solves the name system part, not the firewall part. Though not common, it can be configured to silently drop pings on local interface. That will cause ping to wait much longer.
– spectras
yesterday
@AnoE> solves the name system part, not the firewall part. Though not common, it can be configured to silently drop pings on local interface. That will cause ping to wait much longer.
– spectras
yesterday
+1 for the "fond" memories
– A C
yesterday
+1 for the "fond" memories
– A C
yesterday
add a comment |
up vote
0
down vote
If you want to interactively wait for a new line in a file, then
tail -f
.Waiting for a change on a filesystem? Then use e.g.
inotify / inoticoming
.And there are other options, depending on what you mean with "wait".
add a comment |
up vote
0
down vote
If you want to interactively wait for a new line in a file, then
tail -f
.Waiting for a change on a filesystem? Then use e.g.
inotify / inoticoming
.And there are other options, depending on what you mean with "wait".
add a comment |
up vote
0
down vote
up vote
0
down vote
If you want to interactively wait for a new line in a file, then
tail -f
.Waiting for a change on a filesystem? Then use e.g.
inotify / inoticoming
.And there are other options, depending on what you mean with "wait".
If you want to interactively wait for a new line in a file, then
tail -f
.Waiting for a change on a filesystem? Then use e.g.
inotify / inoticoming
.And there are other options, depending on what you mean with "wait".
answered 15 hours ago
Edheldil
59524
59524
add a comment |
add a comment |
user321697 is a new contributor. Be nice, and check out our Code of Conduct.
user321697 is a new contributor. Be nice, and check out our Code of Conduct.
user321697 is a new contributor. Be nice, and check out our Code of Conduct.
user321697 is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f482725%2fshell-is-it-possible-to-delay-a-command-without-using-sleep%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
40
What's wrong with
sleep
?– muru
2 days ago
4
There's no real reason other than curiosity. I thought it would be interesting to learn some alternative solutions. I think
at
might be one, but I couldn't find any usage examples.– user321697
2 days ago
What do you want to wait for? If there’s an event you’re waiting for, you’d typically use a while loop, testing for the condition and sleeping for one second (or whatever makes sense). If you’re waiting for a child process to finish, then you can use the wait builtin. If it’s something else, do elaborate, please.
– Grega Bremec
2 days ago
1
I came here expecting everyone to suggest a spinlock. I'm pleasantly surprised by all the answers.
– Daan van Hoek
2 days ago
2
Re: "Curiosity" -- in unix.stackexchange.com/help/dont-ask, note the requirement that "You should only ask practical, answerable questions based on actual problems that you face." -- that this has been well-received despite controvening that guideline makes it a rather rare exception.
– Charles Duffy
yesterday