bash script started through cron (root) not ending as expected
I have a script as follows, and I am trying to run it as a root cron job. The script starts mycommand, which in turn starts another process. When a condition is met, I would like the script to kill mycommand and its child process before exiting. Now, this seems to work at the terminal, the child processes end when the condition is met. But when the script is started as a root cron job, mycommand continues to run until I kill it manually. What am I doing wrong?
#!/bin/bash
# function to trap and clean exit
function clean_exit
{
PGID=`ps xao pgid,command,pid | grep 'mycommand'| sed 's/ .*//'`
kill -9 -$PGID
echo "process group killed: "$PGID
}
trap clean_exit SIGINT SIGTERM EXIT
sudo mycommand $1 > output.txt &
while sleep 1; do
# check output.txt every second
if [ condition met]; then
exit 1;
fi;
done
crontab line is as follows:
30 10 * * * bash path/to/myscript.sh
bash cron root
add a comment |
I have a script as follows, and I am trying to run it as a root cron job. The script starts mycommand, which in turn starts another process. When a condition is met, I would like the script to kill mycommand and its child process before exiting. Now, this seems to work at the terminal, the child processes end when the condition is met. But when the script is started as a root cron job, mycommand continues to run until I kill it manually. What am I doing wrong?
#!/bin/bash
# function to trap and clean exit
function clean_exit
{
PGID=`ps xao pgid,command,pid | grep 'mycommand'| sed 's/ .*//'`
kill -9 -$PGID
echo "process group killed: "$PGID
}
trap clean_exit SIGINT SIGTERM EXIT
sudo mycommand $1 > output.txt &
while sleep 1; do
# check output.txt every second
if [ condition met]; then
exit 1;
fi;
done
crontab line is as follows:
30 10 * * * bash path/to/myscript.sh
bash cron root
Hello, in this answer I've used similar approach, but the whole command is stored as value of variable and then it is executed by usingexec
, oreval $variable
; and the test condition isif [[ -z $(ps -aux | grep "$variable" | sed '$ d') ]]
...
– pa4080
Jan 19 at 15:30
3
I'm curious how yourclean_exit
function works at all - on my 16.04 system, all the lines fromps xao pgid,command,pid
start with a space - sosed 's/ .*//'
returns a bunch of empty lines
– steeldriver
Jan 19 at 17:16
@steeldriver That's a good catch! It looks like pgids are right-aligned byps xao
, so i didn't realise that pgids with fewer digits (e.g. 5000) than the higher pgids (e.g. 12345) have leading space(s). I have now changed thatsed
toawk '{print $1}'
and it works as it should in crontab too. I didn't catch it at the terminal because the pgids didn't have leading spaces during testing. Could you post your comment as an answer please, so that I can accept it? Thanks.
– srao
Jan 19 at 20:44
1
Changegrep 'mycommand'
togrep '[m]ycommand'
to exclude thegrep
process from the results.
– dessert
Jan 20 at 8:30
add a comment |
I have a script as follows, and I am trying to run it as a root cron job. The script starts mycommand, which in turn starts another process. When a condition is met, I would like the script to kill mycommand and its child process before exiting. Now, this seems to work at the terminal, the child processes end when the condition is met. But when the script is started as a root cron job, mycommand continues to run until I kill it manually. What am I doing wrong?
#!/bin/bash
# function to trap and clean exit
function clean_exit
{
PGID=`ps xao pgid,command,pid | grep 'mycommand'| sed 's/ .*//'`
kill -9 -$PGID
echo "process group killed: "$PGID
}
trap clean_exit SIGINT SIGTERM EXIT
sudo mycommand $1 > output.txt &
while sleep 1; do
# check output.txt every second
if [ condition met]; then
exit 1;
fi;
done
crontab line is as follows:
30 10 * * * bash path/to/myscript.sh
bash cron root
I have a script as follows, and I am trying to run it as a root cron job. The script starts mycommand, which in turn starts another process. When a condition is met, I would like the script to kill mycommand and its child process before exiting. Now, this seems to work at the terminal, the child processes end when the condition is met. But when the script is started as a root cron job, mycommand continues to run until I kill it manually. What am I doing wrong?
#!/bin/bash
# function to trap and clean exit
function clean_exit
{
PGID=`ps xao pgid,command,pid | grep 'mycommand'| sed 's/ .*//'`
kill -9 -$PGID
echo "process group killed: "$PGID
}
trap clean_exit SIGINT SIGTERM EXIT
sudo mycommand $1 > output.txt &
while sleep 1; do
# check output.txt every second
if [ condition met]; then
exit 1;
fi;
done
crontab line is as follows:
30 10 * * * bash path/to/myscript.sh
bash cron root
bash cron root
asked Jan 19 at 15:08
sraosrao
1062
1062
Hello, in this answer I've used similar approach, but the whole command is stored as value of variable and then it is executed by usingexec
, oreval $variable
; and the test condition isif [[ -z $(ps -aux | grep "$variable" | sed '$ d') ]]
...
– pa4080
Jan 19 at 15:30
3
I'm curious how yourclean_exit
function works at all - on my 16.04 system, all the lines fromps xao pgid,command,pid
start with a space - sosed 's/ .*//'
returns a bunch of empty lines
– steeldriver
Jan 19 at 17:16
@steeldriver That's a good catch! It looks like pgids are right-aligned byps xao
, so i didn't realise that pgids with fewer digits (e.g. 5000) than the higher pgids (e.g. 12345) have leading space(s). I have now changed thatsed
toawk '{print $1}'
and it works as it should in crontab too. I didn't catch it at the terminal because the pgids didn't have leading spaces during testing. Could you post your comment as an answer please, so that I can accept it? Thanks.
– srao
Jan 19 at 20:44
1
Changegrep 'mycommand'
togrep '[m]ycommand'
to exclude thegrep
process from the results.
– dessert
Jan 20 at 8:30
add a comment |
Hello, in this answer I've used similar approach, but the whole command is stored as value of variable and then it is executed by usingexec
, oreval $variable
; and the test condition isif [[ -z $(ps -aux | grep "$variable" | sed '$ d') ]]
...
– pa4080
Jan 19 at 15:30
3
I'm curious how yourclean_exit
function works at all - on my 16.04 system, all the lines fromps xao pgid,command,pid
start with a space - sosed 's/ .*//'
returns a bunch of empty lines
– steeldriver
Jan 19 at 17:16
@steeldriver That's a good catch! It looks like pgids are right-aligned byps xao
, so i didn't realise that pgids with fewer digits (e.g. 5000) than the higher pgids (e.g. 12345) have leading space(s). I have now changed thatsed
toawk '{print $1}'
and it works as it should in crontab too. I didn't catch it at the terminal because the pgids didn't have leading spaces during testing. Could you post your comment as an answer please, so that I can accept it? Thanks.
– srao
Jan 19 at 20:44
1
Changegrep 'mycommand'
togrep '[m]ycommand'
to exclude thegrep
process from the results.
– dessert
Jan 20 at 8:30
Hello, in this answer I've used similar approach, but the whole command is stored as value of variable and then it is executed by using
exec
, or eval $variable
; and the test condition is if [[ -z $(ps -aux | grep "$variable" | sed '$ d') ]]
...– pa4080
Jan 19 at 15:30
Hello, in this answer I've used similar approach, but the whole command is stored as value of variable and then it is executed by using
exec
, or eval $variable
; and the test condition is if [[ -z $(ps -aux | grep "$variable" | sed '$ d') ]]
...– pa4080
Jan 19 at 15:30
3
3
I'm curious how your
clean_exit
function works at all - on my 16.04 system, all the lines from ps xao pgid,command,pid
start with a space - so sed 's/ .*//'
returns a bunch of empty lines– steeldriver
Jan 19 at 17:16
I'm curious how your
clean_exit
function works at all - on my 16.04 system, all the lines from ps xao pgid,command,pid
start with a space - so sed 's/ .*//'
returns a bunch of empty lines– steeldriver
Jan 19 at 17:16
@steeldriver That's a good catch! It looks like pgids are right-aligned by
ps xao
, so i didn't realise that pgids with fewer digits (e.g. 5000) than the higher pgids (e.g. 12345) have leading space(s). I have now changed that sed
to awk '{print $1}'
and it works as it should in crontab too. I didn't catch it at the terminal because the pgids didn't have leading spaces during testing. Could you post your comment as an answer please, so that I can accept it? Thanks.– srao
Jan 19 at 20:44
@steeldriver That's a good catch! It looks like pgids are right-aligned by
ps xao
, so i didn't realise that pgids with fewer digits (e.g. 5000) than the higher pgids (e.g. 12345) have leading space(s). I have now changed that sed
to awk '{print $1}'
and it works as it should in crontab too. I didn't catch it at the terminal because the pgids didn't have leading spaces during testing. Could you post your comment as an answer please, so that I can accept it? Thanks.– srao
Jan 19 at 20:44
1
1
Change
grep 'mycommand'
to grep '[m]ycommand'
to exclude the grep
process from the results.– dessert
Jan 20 at 8:30
Change
grep 'mycommand'
to grep '[m]ycommand'
to exclude the grep
process from the results.– dessert
Jan 20 at 8:30
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "89"
};
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: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
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%2faskubuntu.com%2fquestions%2f1111154%2fbash-script-started-through-cron-root-not-ending-as-expected%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Ask Ubuntu!
- 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%2faskubuntu.com%2fquestions%2f1111154%2fbash-script-started-through-cron-root-not-ending-as-expected%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
Hello, in this answer I've used similar approach, but the whole command is stored as value of variable and then it is executed by using
exec
, oreval $variable
; and the test condition isif [[ -z $(ps -aux | grep "$variable" | sed '$ d') ]]
...– pa4080
Jan 19 at 15:30
3
I'm curious how your
clean_exit
function works at all - on my 16.04 system, all the lines fromps xao pgid,command,pid
start with a space - sosed 's/ .*//'
returns a bunch of empty lines– steeldriver
Jan 19 at 17:16
@steeldriver That's a good catch! It looks like pgids are right-aligned by
ps xao
, so i didn't realise that pgids with fewer digits (e.g. 5000) than the higher pgids (e.g. 12345) have leading space(s). I have now changed thatsed
toawk '{print $1}'
and it works as it should in crontab too. I didn't catch it at the terminal because the pgids didn't have leading spaces during testing. Could you post your comment as an answer please, so that I can accept it? Thanks.– srao
Jan 19 at 20:44
1
Change
grep 'mycommand'
togrep '[m]ycommand'
to exclude thegrep
process from the results.– dessert
Jan 20 at 8:30