Update wrapper script

parent 8f07c660
......@@ -60,11 +60,25 @@ ensure_venv() {
fi
}
# Function to update venv packages silently
update_venv() {
# Update requirements if requirements.txt exists
if [ -f "$SHARE_DIR/requirements.txt" ]; then
"$VENV_DIR/bin/pip" install --upgrade -r "$SHARE_DIR/requirements.txt" -q 2>/dev/null
fi
# Update aisbf package silently
"$VENV_DIR/bin/pip" install --upgrade aisbf -q 2>/dev/null
}
# Function to start the server
start_server() {
# Ensure venv exists
ensure_venv
# Update venv packages silently
update_venv
# Activate the virtual environment
source $VENV_DIR/bin/activate
......@@ -72,7 +86,13 @@ start_server() {
cd $SHARE_DIR
# Start the proxy server with logging
uvicorn main:app --host 0.0.0.0 --port 8000 2>&1 | tee -a "$LOG_DIR/aisbf_stdout.log"
# Redirect stderr to suppress BrokenPipeError during shutdown
uvicorn main:app --host 127.0.0.1 --port 17765 2>&1 | while IFS= read -r line; do
# Filter out BrokenPipeError logging errors
if [[ "$line" != *"--- Logging error ---"* ]] && [[ "$line" != *"BrokenPipeError"* ]] && [[ "$line" != *"Call stack:"* ]] && [[ "$line" != *"File "*"/python"* ]] && [[ "$line" != *"Message:"* ]] && [[ "$line" != *"Arguments:"* ]]; then
echo "$line" | tee -a "$LOG_DIR/aisbf_stdout.log"
fi
done
}
# Function to start as daemon
......@@ -92,8 +112,12 @@ start_daemon() {
# Ensure venv exists
ensure_venv
# Update venv packages silently
update_venv
# Start in background with nohup and logging
nohup bash -c "source $VENV_DIR/bin/activate && cd $SHARE_DIR && uvicorn main:app --host 0.0.0.0 --port 8000" >> "$LOG_DIR/aisbf_stdout.log" 2>&1 &
# Filter out BrokenPipeError logging errors
nohup bash -c "source $VENV_DIR/bin/activate && cd $SHARE_DIR && uvicorn main:app --host 127.0.0.1 --port 17765 2>&1 | grep -v '--- Logging error ---' | grep -v 'BrokenPipeError' | grep -v 'Call stack:' | grep -v 'File .*python' | grep -v 'Message:' | grep -v 'Arguments:'" >> "$LOG_DIR/aisbf_stdout.log" 2>&1 &
PID=$!
echo $PID > "$PIDFILE"
echo "AISBF started in background (PID: $PID)"
......
......@@ -39,6 +39,54 @@ from datetime import datetime, timedelta
from collections import defaultdict
from pathlib import Path
class BrokenPipeFilter(logging.Filter):
"""Filter to suppress BrokenPipeError logging errors"""
def filter(self, record):
# Filter out BrokenPipeError and related logging errors
if record.getMessage().startswith('--- Logging error ---'):
return False
if 'BrokenPipeError' in record.getMessage():
return False
return True
class SafeStderr:
"""Safe stderr wrapper that handles BrokenPipeError gracefully"""
def __init__(self, original_stderr, log_file_path):
self.original_stderr = original_stderr
self.log_file = None
try:
self.log_file = open(log_file_path, 'a')
except Exception:
pass
def write(self, data):
# Filter out BrokenPipeError and related logging errors
if '--- Logging error ---' in data or 'BrokenPipeError' in data:
return
if self.log_file:
try:
self.log_file.write(data)
self.log_file.flush()
except (BrokenPipeError, OSError):
pass
else:
try:
self.original_stderr.write(data)
except (BrokenPipeError, OSError):
pass
def flush(self):
if self.log_file:
try:
self.log_file.flush()
except (BrokenPipeError, OSError):
pass
else:
try:
self.original_stderr.flush()
except (BrokenPipeError, OSError):
pass
def setup_logging():
"""Setup logging with rotating file handlers"""
# Determine log directory based on user
......@@ -102,8 +150,18 @@ def setup_logging():
root_logger.addHandler(error_handler)
root_logger.addHandler(console_handler)
# Redirect stderr to error log
sys.stderr = open(log_dir / 'aisbf_stderr.log', 'a')
# Add BrokenPipeError filter to all handlers
broken_pipe_filter = BrokenPipeFilter()
file_handler.addFilter(broken_pipe_filter)
error_handler.addFilter(broken_pipe_filter)
console_handler.addFilter(broken_pipe_filter)
# Redirect stderr to error log with error handling and BrokenPipeError filtering
try:
sys.stderr = SafeStderr(sys.stderr, log_dir / 'aisbf_stderr.log')
except Exception as e:
logger = logging.getLogger(__name__)
logger.warning(f"Could not redirect stderr: {e}")
return logging.getLogger(__name__)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment