Skip to content

Commit 555d768

Browse files
option added to kill process
1 parent f9636f0 commit 555d768

4 files changed

Lines changed: 90 additions & 8 deletions

File tree

src/routes/process.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,29 @@
1-
from flask import request, render_template, blueprints
1+
import os
2+
from flask import request, render_template, blueprints, redirect, url_for, flash
23

34
from src.config import app
45
from src.utils import get_top_processes
56

67
process_bp = blueprints.Blueprint("process", __name__)
78

8-
99
@app.route("/process", methods=["GET", "POST"])
1010
def process():
1111
number_of_processes = 5 # Default number
12+
1213
if request.method == "POST":
14+
if "kill_pid" in request.form:
15+
# Handle killing the process
16+
pid_to_kill = request.form.get("kill_pid")
17+
process_name = request.form.get("process_name")
18+
try:
19+
os.kill(int(pid_to_kill), 9) # Sends a SIGKILL signal
20+
flash(f"Process '{process_name}' (PID {pid_to_kill}) killed successfully.", "success")
21+
except Exception as e:
22+
flash(f"Failed to kill process '{process_name}' (PID {pid_to_kill}). Error: {e}", "danger")
23+
return redirect(url_for("process")) # Refresh the page after killing process
24+
25+
# Handle the number of processes to display
1326
number_of_processes = int(request.form.get("number", 5))
14-
27+
1528
top_processes = get_top_processes(number_of_processes)
16-
return render_template("process.html", processes=top_processes, number=number_of_processes)
29+
return render_template("process.html", processes=top_processes, number=number_of_processes)

src/templates/ext/navbar.html

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,22 @@
1-
<nav class="navbar navbar-expand-lg navbar-light bg-light shadow-sm"><a class="navbar-brand d-flex align-items-center{% if request.endpoint=='dashboard' %}active{% endif %}" href="{{ url_for('dashboard')}}"><i class="fas fa-home mr-2"></i>Home </a><button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarNav"><ul class="navbar-nav ml-auto"><li class="nav-item"><a class="nav-link{% if request.endpoint=='cpu_usage' %}active{% endif %}" href="{{ url_for('cpu_usage')}}"><i class="fas fa-microchip mr-1"></i>CPU Info </a></li><li class="nav-item"><a class="nav-link{% if request.endpoint=='memory_usage' %}active{% endif %}" href="{{ url_for('memory_usage')}}"><i class="fas fa-memory mr-1"></i>Memory Info </a></li><li class="nav-item"><a class="nav-link{% if request.endpoint=='disk_usage' %}active{% endif %}" href="{{ url_for('disk_usage')}}"><i class="fas fa-hdd mr-1"></i>Disk Info </a></li><li class="nav-item"><a class="nav-link{% if request.endpoint=='network_stats' %}active{% endif %}" href="{{ url_for('network_stats')}}"><i class="fas fa-network-wired mr-1"></i>Network Info </a></li><li class="nav-item"><a class="nav-link{% if request.endpoint=='settings' %}active{% endif %}" href="{{ url_for('settings')}}"><i class="fas fa-cog mr-1"></i>Settings </a></li><li class="nav-item"><a class="nav-link{% if request.endpoint=='process' %}active{% endif %}" href="{{ url_for('process')}}"><i class="fas fa-tasks mr-1"></i>Process </a></li></ul></div></nav>
1+
<nav class="navbar navbar-expand-lg navbar-light bg-light shadow-sm"><a
2+
class="navbar-brand d-flex align-items-center{% if request.endpoint=='dashboard' %}active{% endif %}"
3+
href="{{ url_for('dashboard')}}"><i class="fas fa-home mr-2"></i>Home </a><button class="navbar-toggler"
4+
type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false"
5+
aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
6+
<div class="collapse navbar-collapse" id="navbarNav">
7+
<ul class="navbar-nav ml-auto">
8+
<li class="nav-item"><a class="nav-link{% if request.endpoint=='cpu_usage' %}active{% endif %}"
9+
href="{{ url_for('cpu_usage')}}"><i class="fas fa-microchip mr-1"></i>CPU Info </a></li>
10+
<li class="nav-item"><a class="nav-link{% if request.endpoint=='memory_usage' %}active{% endif %}"
11+
href="{{ url_for('memory_usage')}}"><i class="fas fa-memory mr-1"></i>Memory Info </a></li>
12+
<li class="nav-item"><a class="nav-link{% if request.endpoint=='disk_usage' %}active{% endif %}"
13+
href="{{ url_for('disk_usage')}}"><i class="fas fa-hdd mr-1"></i>Disk Info </a></li>
14+
<li class="nav-item"><a class="nav-link{% if request.endpoint=='network_stats' %}active{% endif %}"
15+
href="{{ url_for('network_stats')}}"><i class="fas fa-network-wired mr-1"></i>Network Info </a></li>
16+
<li class="nav-item"><a class="nav-link{% if request.endpoint=='settings' %}active{% endif %}"
17+
href="{{ url_for('settings')}}"><i class="fas fa-cog mr-1"></i>Settings </a></li>
18+
<li class="nav-item"><a class="nav-link{% if request.endpoint=='process' %}active{% endif %}"
19+
href="{{ url_for('process')}}"><i class="fas fa-tasks mr-1"></i>Process </a></li>
20+
</ul>
21+
</div>
22+
</nav>

src/templates/process.html

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,46 @@
1-
{% extends 'base.html' %}{% block title %}CPU Usage Details{% endblock %}{% block extra_head %}<link rel="stylesheet" href="{{ url_for('static', filename='css/process.css')}}">{% endblock %}{% block content %}<div class="container"><h1>Top Processes by Memory Usage</h1><form method="post" class="form-control"><label for="number">Number of Processes:</label><input type="number" id="number" name="number" min="1" value="{{ number}}"><button type="submit">Show</button></form><table><thead><tr><th>Process Name</th><th>CPU Usage (%)</th><th>Memory Usage (%)</th></tr></thead><tbody>{% for process in processes %} <tr><td>{{ process[0]}}</td><td>{{ process[1]}}</td><td>{{ process[2]}}</td></tr>{% endfor %} </tbody></table></div>{% endblock %}
1+
{% extends 'base.html' %}
2+
{% block title %}CPU Usage Details{% endblock %}
3+
{% block extra_head %}
4+
<link rel="stylesheet" href="{{ url_for('static', filename='css/process.css') }}">
5+
{% endblock %}
6+
{% block content %}
7+
<div class="container">
8+
<h1>Top Processes by Memory Usage</h1>
9+
10+
<!-- Display flash messages -->
11+
{% include 'ext/message.html' %}
12+
13+
<form method="post" class="form-control">
14+
<label for="number">Number of Processes:</label>
15+
<input type="number" id="number" name="number" min="1" value="{{ number }}">
16+
<button type="submit">Show</button>
17+
</form>
18+
19+
<table>
20+
<thead>
21+
<tr>
22+
<th>Process Name</th>
23+
<th>CPU Usage (%)</th>
24+
<th>Memory Usage (%)</th>
25+
<th>Action</th>
26+
</tr>
27+
</thead>
28+
<tbody>
29+
{% for process in processes %}
30+
<tr>
31+
<td>{{ process[0] }}</td>
32+
<td>{{ process[1] }}</td>
33+
<td>{{ process[2] }}</td>
34+
<td>
35+
<form method="post">
36+
<input type="hidden" name="kill_pid" value="{{ process[3] }}">
37+
<input type="hidden" name="process_name" value="{{ process[0] }}">
38+
<button type="submit">Kill</button>
39+
</form>
40+
</td>
41+
</tr>
42+
{% endfor %}
43+
</tbody>
44+
</table>
45+
</div>
46+
{% endblock %}

src/utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,15 +99,18 @@ def get_cpu_temp():
9999
critical_temp = temp.critical
100100
return current_temp, high_temp, critical_temp
101101

102+
import psutil
103+
102104
def get_top_processes(number=5):
103105
"""Get the top processes by memory usage."""
104106
processes = [
105-
(p.info['name'], p.info['cpu_percent'], round(p.info['memory_percent'], 2))
106-
for p in sorted(psutil.process_iter(['name', 'cpu_percent', 'memory_percent']),
107+
(p.info['name'], p.info['cpu_percent'], round(p.info['memory_percent'], 2), p.info['pid'])
108+
for p in sorted(psutil.process_iter(['name', 'cpu_percent', 'memory_percent', 'pid']),
107109
key=lambda p: p.info['memory_percent'], reverse=True)[:number]
108110
]
109111
return processes
110112

113+
111114
def get_system_info():
112115
""" Get system information and store it in the database. """
113116
print("Getting system information...")

0 commit comments

Comments
 (0)