From 12383c6d4e00f9be5cc88fe3151373562c5f6084 Mon Sep 17 00:00:00 2001 From: Shane Date: Wed, 14 May 2025 10:36:36 +1000 Subject: [PATCH] update --- manage_scripts.sh | 213 +++++++++++++++++++++------------------------- requirements.txt | 3 +- 2 files changed, 97 insertions(+), 119 deletions(-) diff --git a/manage_scripts.sh b/manage_scripts.sh index d5c11e4..8c09e43 100755 --- a/manage_scripts.sh +++ b/manage_scripts.sh @@ -6,104 +6,18 @@ LOG_DIR="$BASE_DIR/logs" LOCK_DIR="$BASE_DIR/locks" mkdir -p "$LOG_DIR" "$LOCK_DIR" || { echo "Error: Failed to create $LOG_DIR or $LOCK_DIR"; exit 1; } -# Handle stop command -if [ "$1" == "stop" ]; then - log "Received stop command, stopping all scripts..." - stop_scripts - if pkill -TERM -f "$VENV_PYTHON.*foodie_engagement_generator"; then - log "Sent TERM to foodie_engagement_generator.py" - sleep 2 - pkill -9 -f "$VENV_PYTHON.*foodie_engagement_generator" || true - else - log "No running foodie_engagement_generator.py found" - fi - rm -f "$LOCK_DIR/foodie_engagement_generator.lock" || log "Failed to remove foodie_engagement_generator.lock" - log "Stopped foodie_engagement_generator.py" - if pkill -TERM -f "$VENV_PYTHON.*foodie_weekly_thread"; then - log "Sent TERM to foodie_weekly_thread.py" - sleep 2 - pkill -9 -f "$VENV_PYTHON.*foodie_weekly_thread" || true - else - log "No running foodie_weekly_thread.py found" - fi - rm -f "$LOCK_DIR/foodie_weekly_thread.lock" || log "Failed to remove foodie_weekly_thread.lock" - log "Stopped foodie_weekly_thread.py" - log "All scripts stopped. Reminder: Disable cron jobs to prevent automatic restarts (crontab -e)." - exit 0 -fi - -# Handle start command -if [ "$1" == "start" ]; then - log "Received start command, starting all scripts..." - cd "$BASE_DIR" || { log "Failed to change to $BASE_DIR"; exit 1; } - source "$BASE_DIR/venv/bin/activate" || { log "Failed to activate virtual environment"; exit 1; } - if [ -f "$BASE_DIR/.env" ]; then - while IFS='=' read -r key value; do - if [[ ! -z "$key" && ! "$key" =~ ^# ]]; then - export "$key=$value" - fi - done < <(grep -v '^#' "$BASE_DIR/.env") - log ".env variables loaded" - else - log "Error: .env file not found at $BASE_DIR/.env" - exit 1 - fi - for script in foodie_automator_rss.py foodie_automator_reddit.py foodie_automator_google.py; do - if [ -f "$script" ]; then - sleep_time=$(run_script "$script") - if [ -n "$sleep_time" ]; then - log "Sleeping for $sleep_time seconds after $script" - sleep "$sleep_time" - fi - else - log "Script $script not found" - fi - done - if [ -f "foodie_engagement_generator.py" ]; then - if ! check_running "foodie_engagement_generator"; then - log "Running foodie_engagement_generator.py..." - "$VENV_PYTHON" "foodie_engagement_generator.py" >> "$BASE_DIR/logs/foodie_engagement_generator.log" 2>&1 - log "foodie_engagement_generator.py completed" - fi - else - log "Script foodie_engagement_generator.py not found" - fi - log "All scripts started. Ensure cron jobs are enabled for automatic scheduling (crontab -l)." - exit 0 -fi - -# Handle update command -if [ "$1" == "update" ]; then - if [ -z "$2" ]; then - log "Error: Package name required. Usage: $0 update [version]" - exit 1 - fi - log "Updating package $2..." - if [ -f "$BASE_DIR/update_package.sh" ]; then - "$BASE_DIR/update_package.sh" "$2" "${3:-latest}" || { - log "Error: Failed to update package $2" - exit 1 - } - log "Package $2 updated successfully" - exit 0 - else - log "Error: update_package.sh not found" - exit 1 - fi -fi +# Log function +log() { + echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" + echo "$1" +} # Directory to monitor -BASE_DIR="/home/shane/foodie_automator" CHECKSUM_FILE="$BASE_DIR/.file_checksum" LOG_FILE="$BASE_DIR/logs/manage_scripts.log" VENV_PYTHON="$BASE_DIR/venv/bin/python" LOCK_DIR="$BASE_DIR/locks" -# Log function -log() { - echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" -} - # Calculate checksum of files (excluding logs, JSON files, and venv) calculate_checksum() { find "$BASE_DIR" -type f \ @@ -141,9 +55,19 @@ run_script() { return 1 fi log "Running $script..." - "$VENV_PYTHON" "$script" >> "$script_log" 2>&1 + "$VENV_PYTHON" "$script" >> "$script_log" 2>&1 & + local pid=$! + echo "$pid" > "$LOCK_DIR/${script_name}.lock" + wait "$pid" + local exit_code=$? + if [ $exit_code -eq 0 ]; then + log "$script completed successfully" + else + log "$script failed with exit code $exit_code" + fi sleep_time=$(tail -n 1 "$script_log" | grep -oP 'sleep_time: \K[0-9]+' || echo $((RANDOM % 601 + 1200))) log "$script completed, sleep_time: $sleep_time seconds" + rm -f "$LOCK_DIR/${script_name}.lock" echo "$sleep_time" } @@ -153,14 +77,13 @@ stop_scripts() { for script in foodie_automator_*.py; do if [ -f "$script" ] && [ "$script" != "foodie_weekly_thread.py" ] && [ "$script" != "foodie_engagement_tweet.py" ]; then local script_name="${script%.py}" - pkill -TERM -f "$VENV_PYTHON.*$script_name" || true - fi - done - sleep 10 - for script in foodie_automator_*.py; do - if [ -f "$script" ] && [ "$script" != "foodie_weekly_thread.py" ] && [ "$script" != "foodie_engagement_tweet.py" ]; then - local script_name="${script%.py}" - pkill -9 -f "$VENV_PYTHON.*$script_name" || true + if pkill -TERM -f "$VENV_PYTHON.*$script_name"; then + log "Sent TERM to $script_name" + sleep 2 + pkill -9 -f "$VENV_PYTHON.*$script_name" || true + else + log "No running $script_name found" + fi rm -f "$LOCK_DIR/${script_name}.lock" log "Removed lock file for $script_name" fi @@ -178,33 +101,86 @@ update_dependencies() { fi source "$BASE_DIR/venv/bin/activate" "$VENV_PYTHON" -m pip install --upgrade pip - if [ -f "requirements.lock" ]; then - "$VENV_PYTHON" -m pip install -r requirements.lock || { - log "Failed to install requirements.lock, falling back to requirements.txt" - if [ -f "requirements.txt" ]; then - "$VENV_PYTHON" -m pip install -r requirements.txt || { - log "Failed to install requirements.txt, attempting core dependencies" - "$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager tweepy python-dotenv flickr-api filelock requests-oauthlib - log "Fallback: Installed core dependencies" - } - else - log "Error: requirements.txt not found, installing core dependencies" - "$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager tweepy python-dotenv flickr-api filelock requests-oauthlib - fi - } - elif [ -f "requirements.txt" ]; then + if [ -f "requirements.txt" ]; then "$VENV_PYTHON" -m pip install -r requirements.txt || { log "Failed to install requirements.txt, attempting core dependencies" - "$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager tweepy python-dotenv flickr-api filelock requests-oauthlib + "$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager tweepy python-dotenv flickr-api filelock requests-oauthlib psutil log "Fallback: Installed core dependencies" } else - log "Error: Neither requirements.lock nor requirements.txt found, installing core dependencies" - "$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager tweepy python-dotenv flickr-api filelock requests-oauthlib + log "Error: requirements.txt not found, installing core dependencies" + "$VENV_PYTHON" -m pip install requests openai beautifulsoup4 feedparser praw duckduckgo_search selenium Pillow pytesseract webdriver-manager tweepy python-dotenv flickr-api filelock requests-oauthlib psutil fi log "Dependencies updated." } +# Handle stop command +if [ "$1" == "stop" ]; then + log "Received stop command, stopping all scripts..." + stop_scripts + if pkill -TERM -f "$VENV_PYTHON.*foodie_engagement_generator"; then + log "Sent TERM to foodie_engagement_generator.py" + sleep 2 + pkill -9 -f "$VENV_PYTHON.*foodie_engagement_generator" || true + else + log "No running foodie_engagement_generator.py found" + fi + rm -f "$LOCK_DIR/foodie_engagement_generator.lock" || log "Failed to remove foodie_engagement_generator.lock" + log "Stopped foodie_engagement_generator.py" + if pkill -TERM -f "$VENV_PYTHON.*foodie_weekly_thread"; then + log "Sent TERM to foodie_weekly_thread.py" + sleep 2 + pkill -9 -f "$VENV_PYTHON.*foodie_weekly_thread" || true + else + log "No running foodie_weekly_thread.py found" + fi + rm -f "$LOCK_DIR/foodie_weekly_thread.lock" || log "Failed to remove foodie_weekly_thread.lock" + log "Stopped foodie_weekly_thread.py" + log "All scripts stopped. Reminder: Disable cron jobs to prevent automatic restarts (crontab -e)." + exit 0 +fi + +# Handle start command +if [ "$1" == "start" ]; then + log "Received start command, starting all scripts..." + cd "$BASE_DIR" || { log "Failed to change to $BASE_DIR"; exit 1; } + source "$BASE_DIR/venv/bin/activate" || { log "Failed to activate virtual environment"; exit 1; } + if [ -f "$BASE_DIR/.env" ]; then + while IFS='=' read -r key value; do + if [[ ! -z "$key" && ! "$key" =~ ^# ]]; then + export "$key=$value" + fi + done < <(grep -v '^#' "$BASE_DIR/.env") + log ".env variables loaded" + else + log "Error: .env file not found at $BASE_DIR/.env" + exit 1 + fi + for script in foodie_automator_rss.py foodie_automator_reddit.py foodie_automator_google.py; do + if [ -f "$script" ]; then + sleep_time=$(run_script "$script") + if [ -n "$sleep_time" ]; then + log "Sleeping for $sleep_time seconds after $script" + sleep "$sleep_time" + fi + else + log "Script $script not found" + exit 1 + fi + done + if [ -f "foodie_engagement_generator.py" ]; then + if ! check_running "foodie_engagement_generator"; then + log "Running foodie_engagement_generator.py..." + "$VENV_PYTHON" "foodie_engagement_generator.py" >> "$BASE_DIR/logs/foodie_engagement_generator.log" 2>&1 + log "foodie_engagement_generator.py completed" + fi + else + log "Script foodie_engagement_generator.py not found" + fi + log "All scripts started. Ensure cron jobs are enabled for automatic scheduling (crontab -l)." + exit 0 +fi + # Main logic log "Checking for file changes..." CURRENT_CHECKSUM=$(calculate_checksum) @@ -244,6 +220,7 @@ for script in foodie_automator_rss.py foodie_automator_reddit.py foodie_automato fi else log "Script $script not found" + exit 1 fi done log "All scripts processed." diff --git a/requirements.txt b/requirements.txt index f4a8d67..8a20c35 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,5 @@ tweepy==4.15.0 python-dotenv==1.1.0 flickr-api==0.7.7 filelock==3.16.1 -requests-oauthlib==2.0.0 \ No newline at end of file +requests-oauthlib==2.0.0 +psutil==7.0.0 \ No newline at end of file