Bash script to periodically monitor a process's memory usage


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash script to periodically monitor a process's memory usage
# 1  
Old 03-15-2020
Bash script to periodically monitor a process's memory usage

I'm looking for a bash script that allows me to start a process in background, monitor its memory consumption every 10 minutes for example, and if it exceeds a certain value kill it and restart it.
Some idea?
I'm new to bash programming, I started writing a script and after testing it I always get the same error,
Code:
syntax error near unexpected token 'fi'

how to proceed? I run the code on an ec2 aws istance


Code:
    #note that this code is incomplete while loop missing
    #!/usr/bin/bash
    sudo python3 main.py &
    pidlist=$(pidof python3 main.py)
    read FIRST __ <<< "$pidlist"
    echo "$FIRST"
    #memory in percent
    mem=$(ps -p "$FIRST" -o %mem)
    echo "$mem"
    set -- $mem
    memory="$2"
    if [ "$memory" -gt "20.0" ];then
      echo "killing process"
    fi


Last edited by james101; 03-16-2020 at 02:59 PM..
# 2  
Old 03-16-2020
Hello and welcome
It's customary to help on this resource, that is, you solve a problem and you don't succeed or you're stuck on something and don't know how to continue. Therefore, if you have a desire to try to write such a script yourself, then everyone here will readily help you. In addition,
creation is much more interesting and useful. The script is quite ordinary and writing will take much less time than finding a ready-made solution. If you are ready to make an effort, it is useful to start by breaking the task down into stages.

First, launching the scheduled task. For this, I think 'crontab' will work well.

Second, getting value of consumption process memory. The 'ps' utility is well suited for this, which can take a command name with the option '-C' or the process id with '-p' option. Using the formatted '-o pmem=' output, you can get memory consumption in percentage terms. This value is of type float, but cutting off the decimal part will not be a problem.

And last, comparing the obtained value with a constant, we determine the need for restarting the process.

My regards
These 4 Users Gave Thanks to nezabudka For This Post:
# 3  
Old 03-16-2020
I'm new to bash programming, I started writing a script and after testing it I always get the same error,
Code:
syntax error near unexpected token 'fi'

how to proceed? I run the code on an ec2 aws istance


Code:
    #note that this code is incomplete while loop missing
    #!/usr/bin/bash
    sudo python3 main.py &
    pidlist=$(pidof python3 main.py)
    read FIRST __ <<< "$pidlist"
    echo "$FIRST"
    #memory in percent
    mem=$(ps -p "$FIRST" -o %mem)
    echo "$mem"
    set -- $mem
    memory="$2"
    if [ "$memory" -gt "20.0" ];then
      echo "killing process"
    fi

# 4  
Old 03-16-2020
I can't reproduce that specific error with the script you posted. Sure you posted the correct and complete one?


Two comments:
- The #! token ("shebang") HAS to be the first two chars of a script file in order to work.
- bash doesn't handle floating variables or values - neither $memory which is filled by ps with decimals, nor the "20.0" constant.






EDIT: OK, got it:
your script lines seem to be terminated with DOS line terminators <CR> = \r = 0x0D = ^M. With

Code:
if [ "$memory" -gt "20" ];then^M
bash: syntax error near unexpected token `fi'

, I have the same error ...
Use a decent *nix text editor!

Last edited by RudiC; 03-16-2020 at 09:54 PM..
This User Gave Thanks to RudiC For This Post:
# 5  
Old 03-16-2020
thanks for the advice it worked now after some tests I have come to write this code
Code:
#!/bin/bash
sudo python3 main.py &
sleep 5
pidlist=$(pidof python3 main.py)
echo "$pidlist"
read FIRST __ <<< "$pidlist"
echo "$FIRST"
mem=$(ps -p "$FIRST" -o %mem)
echo "$mem"
set -- $mem
memory="$2"
while true;
do
  sleep 2
  echo "$memory"
  if (( $(echo "${memory} > 20.0" | bc) )); then
    echo "killing process"
    sudo kill "$FIRST"
    break
  fi
  sleep 2
done

I can correctly take the right pid of the process I would like to kill, but the sudo kill "$ FIRST" command does not seem to work and upon exiting the script, typing htop on the console, the process is still alive.
Also if I type sudo kill #pid directly on the console this command works and kills the process
# 6  
Old 03-16-2020
I don't know why sudo kill PID should not work.


Another twothree comments:
- bash provides the PID of the last process put in background in the $! variable (man bash).
- suppress ps' heading by supplying a = sign after the %mem so you have a single value.
- modify the $memory value WITHIN the loop; else you will either immediately break out, or enter an infinite loop.


So your script could be reduced to
Code:
sudo python3 main.py &
while true;
  do    if (( $(ps -p "$!" -o %mem=) > 20" | bc) ))
          then  sudo kill "$!"
                break
        fi
  done

Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Shell script for logging cpu and memory usage of a Linux process

I am looking for a way to log and graphically display cpu and RAM usage of linux processes over time. Since I couldn't find a simple tool to so (I tried zabbix and munin but installation failed) I started writing a shell script to do so The script file parses the output of top command through... (2 Replies)
Discussion started by: andy_dufresne
2 Replies

2. UNIX for Dummies Questions & Answers

What to monitor for memory usage?

hi guys I am having a doubt about memory monitoring on linux system what I should be monitoring? memory usage? o swap usage? I am using some monitoring tools but I am confused to what monitor for alerting for example this case looks the memory usage is very high and it's like that all... (2 Replies)
Discussion started by: karlochacon
2 Replies

3. Shell Programming and Scripting

Memory Usage Monitor on Linux/SunOS Servers

ok, so i'm trying to write a shell script (not perl) that monitors memory usage on a server. but i'm confused as to what fields exactly determines that yes, memory is low on a particular server. it sounds simple enough, but it really isn't. what do I look for in the field below? ... (1 Reply)
Discussion started by: SkySmart
1 Replies

4. Emergency UNIX and Linux Support

How to monitor a process memory utilization?

hi frnds, I want to monitor a particular process very closly on how much memory it is taking. i tried with TOP and PRSTAT commands that is not giving what exactly i need. In my application, there is a memory leak happening, i want to know when it is occuering, means which transcation is... (9 Replies)
Discussion started by: vij_krr
9 Replies

5. UNIX for Advanced & Expert Users

How often should I monitor the CPU and memory usage ?

Hi all, When you monitor the CPU and memory usage, how often do you do it ? Do it too often or too rarely will both cause the problem. So does anyone have hand-on experience ? And for my case, the requirement says that when CPU usage is above X% or memory usage is above Y%, I should reject... (5 Replies)
Discussion started by: qiulang
5 Replies

6. UNIX for Dummies Questions & Answers

Monitor Memory of a process

Hi, I need to monitor the memory usage of a particular process continuously. As of now I am using the following command: ps -fu <user name> -o pid,comm,vsz | grep <process_name> | grep -v grep The output of this command gives me what i need except i want the output to keep getting updated... (3 Replies)
Discussion started by: archana485
3 Replies

7. AIX

How to monitor the IBM AIX server for I/O usage,memory usage,CPU usage,network..?

How to monitor the IBM AIX server for I/O usage, memory usage, CPU usage, network usage, storage usage? (3 Replies)
Discussion started by: laknar
3 Replies

8. Shell Programming and Scripting

Memory usage of a process

hi all, i want to write a script that checks the memory usage of processes and send a mail with the name of the process witch is using more then 300mb RAM. dose anybody have a sample script or an idea how i can make it ? PROCCESSES="snmpd sendmail" for myVar in $PROCCESSES do ... (7 Replies)
Discussion started by: tafil
7 Replies

9. Programming

Monitor CPU usage and Memory Usage

how can i monitor usages of CPU, Memory, Hard disk etc. under SUN Solaries through a c program or java program i want to store that data into database so i can show it graphically thanks in advance (2 Replies)
Discussion started by: Gajanad Bihani
2 Replies
Login or Register to Ask a Question