Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I am looking for a Shell Script which I can execute which will Execute a Program that needs to run for infinite amount of time until I choose to kill it.

I am already tried nohup, screen, disown (in netcat /bin/sh Shell) but they all failed to do the job.

The Program which needs to run also needs arguments.

EDIT: Comments asked me to mention the Problems with the methods I tried.

nohup: Closing the NetCat window also closes the Process

bg: At the start NetCat reports : "No Job Control in this session"

disown: Same result as nohup

screen: "Must be connected to a Terminal"

share|improve this question
1  
Running a program in screen, tmux or with nohup & should all work. You already mentioned most of these. Why did these not work? Which problems did you run into ? –  Hennes Aug 28 '13 at 19:34
    
Added the Problems with the used commands. –  John Aug 28 '13 at 19:40
    
How did you try to use screen? Once you're in a screen session you are in a terminal. If you tried to execute the command directly from the command line i.e. % screen myCommand then you're not going to have a controlling terminal. Just type screen, run your command after you get a new prompt. You can then close the window and your screen session will continue. –  skarface Aug 28 '13 at 20:34
    
pastebin.com/9JKx0wd8 This seems to be someone trying to do the same thing. –  skarface Aug 28 '13 at 20:46

2 Answers 2

Replace "bash foo.sh" with whatever you need to run. will not survive reboots.

perl -e "if(fork){exit}else{exec(\"bash foo.sh\")}"

edit: You can print $$ to a file in the else, prior to the exec if you want to capture the pid. You can also just grep through PS output to kill based on pid.

share|improve this answer
    
From the OP: "needs to run for infinite amount of time until I choose to kill it" – not sure if a reboot is included there. –  slhck Aug 28 '13 at 19:46
    
then add the above to your boot scripts. there's very little that will automatically survive a reboot. nohup/screen/etc surely don't. –  skarface Aug 28 '13 at 19:49
    
I just need it to run as long as the system is up. –  John Aug 28 '13 at 19:50
    
Oh, I think you misunderstood. I was just thinking about the "how to go about killing it" part. –  slhck Aug 28 '13 at 19:50
    
I think I should be able to kill it using kill -9 PID –  John Aug 28 '13 at 19:54

First of all, a shell script can not prevent some (background) process from terminating if the OS decides to kill it or if the process dies. With that said, here is a suggestion on how to restart a service. It is crude, but simple.

Create a "semaphore" file and use that to break a forever-loop that restarts some job.

#!/bin/sh

function run {
    local t=`mktemp  /tmp/service.XXX`
    touch $t
    while [ -f $t ]; do
        # restart a job here, e.g
        nc -l -p 4444 & pid=$!
        echo $pid > $t
        wait $pid
    done 
}

function stop {
    local pf=`ls /tmp/service.*| wc -l`
    if [ $pf -gt 1 ]; then
        echo why are there several pid files?

    elsif [ $pf -lt 1 ]; 
        echo nothing to stop

    else 
        pid=`cat /tmp/service.*`
        rm -f /tmp/service.*
        kill $pid
    fi
}

Source the file in your shell and run the functions. The script may contain errors, but the idea should be usable.

share|improve this answer
    
I think the OP is asking for something that will stay running even once the controlling session dies. The above will make something resilient to being killed, but it won't stop a process from dying when the controlling session goes away. You need to fork somewhere. –  skarface Aug 28 '13 at 20:37
    
You're right. I forgot to mention that it should run in a screen. –  Ярослав Рахматуллин Aug 28 '13 at 20:45

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.