Terminate BASH For loop, that contains long sleep and other stuff, using any specific key
I have a bash script that
has a for loop that iterates a lot of times and sleeps between iterations, potentially for a long time. It then
writes results to a file, then terminates.
On occasion I get the result I need before many loop iterations are complete.
On these occasions I need the script to break
out of the for loop while it is either
doing stuff, or
sleeping
in such as way that it will continue with the rest of the script, after the for loop, which is writing a report file of data it's gathered so far.
I wish to use a key combination, eg CTRL+Q, to break
out of the for loop.
Script looks like this:
#!/bin/bash
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
# sleep potentially for a long time
sleep $2
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
bash shell-script sleep
add a comment |
I have a bash script that
has a for loop that iterates a lot of times and sleeps between iterations, potentially for a long time. It then
writes results to a file, then terminates.
On occasion I get the result I need before many loop iterations are complete.
On these occasions I need the script to break
out of the for loop while it is either
doing stuff, or
sleeping
in such as way that it will continue with the rest of the script, after the for loop, which is writing a report file of data it's gathered so far.
I wish to use a key combination, eg CTRL+Q, to break
out of the for loop.
Script looks like this:
#!/bin/bash
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
# sleep potentially for a long time
sleep $2
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
bash shell-script sleep
add a comment |
I have a bash script that
has a for loop that iterates a lot of times and sleeps between iterations, potentially for a long time. It then
writes results to a file, then terminates.
On occasion I get the result I need before many loop iterations are complete.
On these occasions I need the script to break
out of the for loop while it is either
doing stuff, or
sleeping
in such as way that it will continue with the rest of the script, after the for loop, which is writing a report file of data it's gathered so far.
I wish to use a key combination, eg CTRL+Q, to break
out of the for loop.
Script looks like this:
#!/bin/bash
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
# sleep potentially for a long time
sleep $2
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
bash shell-script sleep
I have a bash script that
has a for loop that iterates a lot of times and sleeps between iterations, potentially for a long time. It then
writes results to a file, then terminates.
On occasion I get the result I need before many loop iterations are complete.
On these occasions I need the script to break
out of the for loop while it is either
doing stuff, or
sleeping
in such as way that it will continue with the rest of the script, after the for loop, which is writing a report file of data it's gathered so far.
I wish to use a key combination, eg CTRL+Q, to break
out of the for loop.
Script looks like this:
#!/bin/bash
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
# sleep potentially for a long time
sleep $2
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
bash shell-script sleep
bash shell-script sleep
edited 36 mins ago
Kes
asked 51 mins ago
KesKes
816
816
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
I've not had contact with this kind of tasks for a while, but I remember something like this used to work:
#!/bin/bash
trap break INT
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
echo loop "$c" before sleep
# sleep potentially for a long time
sleep "$2"
echo loop "$c" after sleep
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
echo outside
The idea is to use Ctrl-C to break the loop. This signal (SIGINT) is caught by the trap, which breaks the loop and lets the rest of the script follow.
Example:
$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside
Let me know if you have any problems with this.
Thank you @Tomasz, this works!
– Kes
13 mins ago
add a comment |
The easiest way is to use Ctrl+C, since by default it gives the INT
signal, which causes most applications to stop, and you can catch it in the shell.
To interrupt the whole loop at once, you could run it in a subshell, and exit
when interrupted. Here, the trap is set only in the subshell, and only it exits.
#!/bin/bash
(
trap "echo interrupted.; exit 0" INT
while true; do
echo "running some task..."
some heavy task
echo "running sleep..."
sleep 5;
echo "iteration end."
done
)
echo "script end."
Thanks @ilkkachu it does work.
– Kes
18 mins ago
1
@Kes, hmmh, I tested that on Debian with Bash 4.4. and Bash 5, and I'm not sure what would cause the difference. But if Tomasz'sbreak
solution works, then use that!
– ilkkachu
11 mins ago
Thanks @ilkkachu for your solution. It does work. It was my mistake. I forgot to use the shift to get the upper case C.
– Kes
9 mins ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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%2f496881%2fterminate-bash-for-loop-that-contains-long-sleep-and-other-stuff-using-any-spe%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
I've not had contact with this kind of tasks for a while, but I remember something like this used to work:
#!/bin/bash
trap break INT
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
echo loop "$c" before sleep
# sleep potentially for a long time
sleep "$2"
echo loop "$c" after sleep
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
echo outside
The idea is to use Ctrl-C to break the loop. This signal (SIGINT) is caught by the trap, which breaks the loop and lets the rest of the script follow.
Example:
$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside
Let me know if you have any problems with this.
Thank you @Tomasz, this works!
– Kes
13 mins ago
add a comment |
I've not had contact with this kind of tasks for a while, but I remember something like this used to work:
#!/bin/bash
trap break INT
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
echo loop "$c" before sleep
# sleep potentially for a long time
sleep "$2"
echo loop "$c" after sleep
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
echo outside
The idea is to use Ctrl-C to break the loop. This signal (SIGINT) is caught by the trap, which breaks the loop and lets the rest of the script follow.
Example:
$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside
Let me know if you have any problems with this.
Thank you @Tomasz, this works!
– Kes
13 mins ago
add a comment |
I've not had contact with this kind of tasks for a while, but I remember something like this used to work:
#!/bin/bash
trap break INT
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
echo loop "$c" before sleep
# sleep potentially for a long time
sleep "$2"
echo loop "$c" after sleep
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
echo outside
The idea is to use Ctrl-C to break the loop. This signal (SIGINT) is caught by the trap, which breaks the loop and lets the rest of the script follow.
Example:
$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside
Let me know if you have any problems with this.
I've not had contact with this kind of tasks for a while, but I remember something like this used to work:
#!/bin/bash
trap break INT
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
echo loop "$c" before sleep
# sleep potentially for a long time
sleep "$2"
echo loop "$c" after sleep
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
echo outside
The idea is to use Ctrl-C to break the loop. This signal (SIGINT) is caught by the trap, which breaks the loop and lets the rest of the script follow.
Example:
$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside
Let me know if you have any problems with this.
answered 25 mins ago
TomaszTomasz
9,47152965
9,47152965
Thank you @Tomasz, this works!
– Kes
13 mins ago
add a comment |
Thank you @Tomasz, this works!
– Kes
13 mins ago
Thank you @Tomasz, this works!
– Kes
13 mins ago
Thank you @Tomasz, this works!
– Kes
13 mins ago
add a comment |
The easiest way is to use Ctrl+C, since by default it gives the INT
signal, which causes most applications to stop, and you can catch it in the shell.
To interrupt the whole loop at once, you could run it in a subshell, and exit
when interrupted. Here, the trap is set only in the subshell, and only it exits.
#!/bin/bash
(
trap "echo interrupted.; exit 0" INT
while true; do
echo "running some task..."
some heavy task
echo "running sleep..."
sleep 5;
echo "iteration end."
done
)
echo "script end."
Thanks @ilkkachu it does work.
– Kes
18 mins ago
1
@Kes, hmmh, I tested that on Debian with Bash 4.4. and Bash 5, and I'm not sure what would cause the difference. But if Tomasz'sbreak
solution works, then use that!
– ilkkachu
11 mins ago
Thanks @ilkkachu for your solution. It does work. It was my mistake. I forgot to use the shift to get the upper case C.
– Kes
9 mins ago
add a comment |
The easiest way is to use Ctrl+C, since by default it gives the INT
signal, which causes most applications to stop, and you can catch it in the shell.
To interrupt the whole loop at once, you could run it in a subshell, and exit
when interrupted. Here, the trap is set only in the subshell, and only it exits.
#!/bin/bash
(
trap "echo interrupted.; exit 0" INT
while true; do
echo "running some task..."
some heavy task
echo "running sleep..."
sleep 5;
echo "iteration end."
done
)
echo "script end."
Thanks @ilkkachu it does work.
– Kes
18 mins ago
1
@Kes, hmmh, I tested that on Debian with Bash 4.4. and Bash 5, and I'm not sure what would cause the difference. But if Tomasz'sbreak
solution works, then use that!
– ilkkachu
11 mins ago
Thanks @ilkkachu for your solution. It does work. It was my mistake. I forgot to use the shift to get the upper case C.
– Kes
9 mins ago
add a comment |
The easiest way is to use Ctrl+C, since by default it gives the INT
signal, which causes most applications to stop, and you can catch it in the shell.
To interrupt the whole loop at once, you could run it in a subshell, and exit
when interrupted. Here, the trap is set only in the subshell, and only it exits.
#!/bin/bash
(
trap "echo interrupted.; exit 0" INT
while true; do
echo "running some task..."
some heavy task
echo "running sleep..."
sleep 5;
echo "iteration end."
done
)
echo "script end."
The easiest way is to use Ctrl+C, since by default it gives the INT
signal, which causes most applications to stop, and you can catch it in the shell.
To interrupt the whole loop at once, you could run it in a subshell, and exit
when interrupted. Here, the trap is set only in the subshell, and only it exits.
#!/bin/bash
(
trap "echo interrupted.; exit 0" INT
while true; do
echo "running some task..."
some heavy task
echo "running sleep..."
sleep 5;
echo "iteration end."
done
)
echo "script end."
answered 23 mins ago
ilkkachuilkkachu
57.1k785158
57.1k785158
Thanks @ilkkachu it does work.
– Kes
18 mins ago
1
@Kes, hmmh, I tested that on Debian with Bash 4.4. and Bash 5, and I'm not sure what would cause the difference. But if Tomasz'sbreak
solution works, then use that!
– ilkkachu
11 mins ago
Thanks @ilkkachu for your solution. It does work. It was my mistake. I forgot to use the shift to get the upper case C.
– Kes
9 mins ago
add a comment |
Thanks @ilkkachu it does work.
– Kes
18 mins ago
1
@Kes, hmmh, I tested that on Debian with Bash 4.4. and Bash 5, and I'm not sure what would cause the difference. But if Tomasz'sbreak
solution works, then use that!
– ilkkachu
11 mins ago
Thanks @ilkkachu for your solution. It does work. It was my mistake. I forgot to use the shift to get the upper case C.
– Kes
9 mins ago
Thanks @ilkkachu it does work.
– Kes
18 mins ago
Thanks @ilkkachu it does work.
– Kes
18 mins ago
1
1
@Kes, hmmh, I tested that on Debian with Bash 4.4. and Bash 5, and I'm not sure what would cause the difference. But if Tomasz's
break
solution works, then use that!– ilkkachu
11 mins ago
@Kes, hmmh, I tested that on Debian with Bash 4.4. and Bash 5, and I'm not sure what would cause the difference. But if Tomasz's
break
solution works, then use that!– ilkkachu
11 mins ago
Thanks @ilkkachu for your solution. It does work. It was my mistake. I forgot to use the shift to get the upper case C.
– Kes
9 mins ago
Thanks @ilkkachu for your solution. It does work. It was my mistake. I forgot to use the shift to get the upper case C.
– Kes
9 mins ago
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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%2f496881%2fterminate-bash-for-loop-that-contains-long-sleep-and-other-stuff-using-any-spe%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