Back to skills
SkillHub ClubShip Full StackFull Stack

py-stop-local

Imported from https://github.com/asnar00/miso.

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
1
Hot score
77
Updated
March 20, 2026
Overall rating
C2.6
Composite score
2.6
Best-practice grade
A92.4

Install command

npx @skill-hub/cli install asnar00-miso-py-stop-local

Repository

asnar00/miso

Skill path: .claude/skills/py-stop-local

Imported from https://github.com/asnar00/miso.

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: asnar00.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install py-stop-local into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/asnar00/miso before adding py-stop-local to shared team environments
  • Use py-stop-local for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: py-stop-local
description: Stop local Flask server running on port 8080. Kills process cleanly using lsof or PID file. Use when stopping local Python development server.
---

# Python Stop Local Server

## Overview

Stops a locally running Flask server by killing the process on port 8080. Works for both foreground and background server instances.

## When to Use

Invoke this skill when the user:
- Asks to "stop the server"
- Wants to "kill the Flask app"
- Says "stop local server"
- Mentions shutting down the Python server
- Needs to stop before deploying or restarting

## Prerequisites

- Server must be running on port 8080
- Either a PID file exists (server.pid) or lsof command available
- macOS or Linux system

## Instructions

### Option 1: Using stop.sh Script

1. Navigate to the server directory:
   ```bash
   cd path/to/server/imp/py
   ```

2. Run the stop script:
   ```bash
   ./stop.sh
   ```

3. The script will:
   - Read PID from server.pid file
   - Kill the process
   - Clean up PID file
   - Report success

### Option 2: Manual Stop by Port

If no script available:
```bash
lsof -ti:8080 | xargs kill
```

This finds and kills any process using port 8080.

### Option 3: Foreground Server

If running in foreground mode:
- Press **Ctrl+C** in the terminal

## Expected Output

**Using stop.sh**:
```
🛑 Stopping Firefly server...
✅ Server stopped (PID: 12345)
```

**Manual stop**:
```
# Silent if successful, or:
kill: 12345: No such process (if already stopped)
```

## How It Works

**stop.sh script**:
```bash
if [ -f server.pid ]; then
    PID=$(cat server.pid)
    kill $PID
    rm server.pid
    echo "Server stopped"
else
    # Fallback: kill by port
    lsof -ti:8080 | xargs kill
fi
```

**lsof method**:
- `lsof -ti:8080`: Lists process IDs using port 8080
- `xargs kill`: Pipes PIDs to kill command
- Clean termination (SIGTERM)

## Verification

Check server is stopped:
```bash
# Try to curl - should fail
curl http://localhost:8080/api/ping

# Check port is free
lsof -ti:8080
# (no output = port free)
```

## Common Issues

**"No such process"**:
- Server already stopped (not an error)
- PID file may be stale
- Delete server.pid if it exists

**"Operation not permitted"**:
- Server running as different user
- Try with sudo (not recommended)
- Check process owner: `ps aux | grep python3`

**Port still in use after stop**:
- Process didn't terminate cleanly
- Force kill: `lsof -ti:8080 | xargs kill -9`
- Wait a few seconds for port to free

**server.pid file not found**:
- Server wasn't started with start.sh
- Use manual stop: `lsof -ti:8080 | xargs kill`
- Or kill foreground server with Ctrl+C

## Kill Signals

**SIGTERM** (default `kill`):
- Polite termination request
- Allows cleanup
- Process can catch and handle
- Used by stop.sh

**SIGKILL** (`kill -9`):
- Immediate termination
- No cleanup possible
- Cannot be caught
- Use as last resort

Always try SIGTERM first.

## When to Stop

**Before deploying**:
```bash
./stop.sh
# Make changes
./start.sh
```

**Before testing different port**:
```bash
./stop.sh
# Edit app.py to use different port
python3 app.py
```

**Before remote deployment**:
```bash
./stop.sh  # Stop local
# Deploy to remote with py-deploy-remote
```

**When switching modes**:
```bash
# Stop background server
./stop.sh
# Start foreground for debugging
python3 app.py
```

## Port Conflicts

If port 8080 is used by another app:

**Find what's using port**:
```bash
lsof -i:8080
```

**Output shows**:
```
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python3  12345 user   3u  IPv4  0x...  0t0  TCP *:8080 (LISTEN)
```

**Kill specific process**:
```bash
kill 12345
```

## Cleanup

The stop script cleans up:
- Terminates Python process
- Removes server.pid file
- Frees port 8080

Logs (server.log) are preserved for review.

## Safe to Call Repeatedly

This operation is idempotent:
- Safe to call if server already stopped
- Won't error on missing PID
- Graceful failure on no process found

## Integration with Other Skills

**Restart workflow**:
1. py-stop-local
2. Make code changes
3. py-start-local

**Deploy workflow**:
1. py-stop-local (local server)
2. py-deploy-remote (to production)
3. py-start-local (resume local development)

## Alternative: Process Manager

For production, use a process manager:
- **supervisord**: Automatic restart, logging
- **systemd**: System-level service
- **pm2**: Node.js-based process manager

But for development, manual start/stop is simpler.

## Notes

- Only stops server on current machine
- Does not affect remote deployments
- Port 8080 becomes available immediately after stop
- Logs remain in server.log for review
- PID file is automatically cleaned up