Script to restart the PID automatically

399 views Asked by At

I was wondering if you have any scripts that take the PID of the processes that are sleeping (S) and restart it automatically

restart_pid() {
# First we need to find the program's arguments
SAVED_COMMAND="$(while IFS= read -r -d $'\0' f; do printf '%q ' "$f"; done < /proc/$1/cmdline)"
# Then we need to cd into its directory so that we stay as true to the intial conditions as possible
cd /proc/$1/cwd
# Now kill the process
kill $1
# Now we can restart the process
eval $SAVED_COMMAND
}
ps -ef
Zoho 3
htop
restart_pid 23924
kill -HUP 23924

I use a script to restart the process via the PID, but every time I need to pass the PID in the script. Is there any way to automate this?

1

There are 1 answers

0
Raman Sailopal On

ps can show you a list of process ids and their current state:

ps -eo stat -o pid -o comm

Further information taken from the ps man pages about the state codes:

PROCESS STATE CODES Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:

           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped by job control signal
           t    stopped by debugger during the tracing
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by
                its parent

   For BSD formats and when the stat keyword is used, additional
   characters may be displayed:

           <    high-priority (not nice to other users)
           N    low-priority (nice to other users)
           L    has pages locked into memory (for real-time and custom IO)
           s    is a session leader
           l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                do)
           +    is in the foreground process group

The ps command will no doubt will need further refining based on process name (comm) and this can be done through awk. So for example, looking for processes named "myapp"

ps -eo stat -o pid | awk '$1=="S" && $3=="myapp" { print $2 }'

Check that the process state (first space delimited field) is S and the process name (third space delimited field) is equal to myapp. Finally, assuming that the processes are as expected (IMPORTANT STEP), this can be integrated with your restart script to restart all the processes by utilising awk's system function:

ps -eo stat -o pid | awk '$1=="S" { system("./restartscript "$2) }'