Pro tip hosszú futásidejű scriptek "fülleltartására" macOS-en

Demonstráció: https://www.youtube.com/watch?v=fAHT0uDNu4k

Ha van egy sokáig tartó scripted, amit nem szeretnél folyamatosan szemmel tartani, de azért jó lenne, ha a haladásról, vagy hibáról azonnal értesülnél, akkor macOS-en van egy OOTB megoldás.

Bash

if [[ "$OSTYPE" == "darwin"* ]]; then
    say "Starting the long process now."
fi

Error handling

# Function to handle errors in a bash script
error_handler() {
    ERROR_MESSAGE="An error occurred during script execution."
    echo "$ERROR_MESSAGE"
    if [[ "$OSTYPE" == "darwin"* ]]; then
        say "$ERROR_MESSAGE"
    fi
    exit 1
}

# Set trap to catch errors
trap 'error_handler' ERR

 

Python

import platform
import subprocess

(...)

def say(text):
    if platform.system() == "Darwin":  # Check if the system is macOS
        subprocess.run(["say", text])
    else:
        print(text)  # Fallback for non-macOS systems

(...)

say("25% completed")

----------

Ezzel a módszerrel súlyos tíz-perceket, és elkerülhető káromkodásokat lehet megspórolni.

A linkelt videóban a Bash és a Bash error handling van bemutatva.

A Pythonos - meglepő módon - ugyanígy hangzik.

Hozzászólások

én mondjuk

osascript -e "display notification \"$ERROR_MESSAGE\" with title \"Error\""

parancsot használnék

4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.

Szerkesztve: 2024. 09. 01., v – 23:22

Van egy pythonos programom, ami versenymusort tolt le a celfotos programnak, es az idoeredmenyeket meg visszatolti a serverre. Az egyik srac, aki a versenylebonyolitot kezelte kerdezte, hogy miert nem mondja be, amikor feltoltotte az x-edik futamot? Par perc mulva bemondta :D

A pyttsx3 modult hasznaltam, ez platformfuggetlen (legalabbis Linuxon meg Win10 alatt is megy, OSX-et nem tudom).

import pyttsx3
...
self.engine = pyttsx3.init()  # ez inicializalja, ugy emlekszem opcionalis parameterekkel
...
self.
engine.say(msg)  # ez elkuldi az engine-nek a mondanivalot, de itt meg csak osszegyulik

self.engine.runAndWait()  # ez meg bemondja.. ugy emlekszem, a multithread-es megoldas nem ment stabilan, de nekem nem kellett feltetlenul (van olyan, ami a hatterben mondja be, es megy tovabb)

Volt egy masik eset, egyik kollegam (CNC kezelo) kerdezte nem lehetne-e megoldani, hogy ha kesz az alkatresz, akkor kuldjon SMS-t neki. Rakerestem, SMS az kicsit korulmenyesebb, de a Gmail-re talaltam egyszeruen hasznalhato Python modult. Vegul mondta, hogy csak hulyeskedett, es leallitott, de szerintem az sem lett volna sok ido (15-20 perc). Ebben az a jo, hogy nem kell, hogy mellette ulj (plusz ha tavoli serveren szamol valamit, akkor is megy).

Voltam egy data engineer tanfolyamon, ott az egyik mentor mondta, hogy o szereti ugy megcsinalni a kodjait, hogy a notebook vegen egy hang jelzi, ha kesz. Ha gyanusan sokaig tart - vagy elakad, akkor rogton tudja, hogy valami baj van. Nala a winsound (ez tudtommal OS-fuggo) volt a megoldas:

import winsound
winsound.Beep(freq, notify_time)

Viszont van platformfuggetlen is, ez hangfile-t tud lejatszani:

from playsound import playsound
playsound('blabla.wav')

Nagyjabol ezeket szoktam hasznalni en is. (ja, es bashbol meg lehet hivni pythont, szoval onnan is megy ugyanez)

A strange game. The only winning move is not to play. How about a nice game of chess?

Én ZSH-t használok, és ahhoz van egy OhMyZsh nevű keretrendszer ami elég okos és elég sokmindent tud, completiontől kezdve sokmindenig. Ebben van egy bgnotify plugin, az gyakorlatilag ha a terminál ablak épp inaktív/nincs fókuszban, akkor küld egy notification-t ha lefutott az adott parancs. Sajnos nem tudom milyen mágia hajtja, így azt sem, hogy macOS alatt megy-e vagy csak Linux alatt.

Blog | @hron84

valahol egy üzemeltetőmaci most mérgesen toppant a lábával 

via @snq-

Mostanaban shellnek a xonsh-t probalgatom. Kicsit olyan, mint ha a pythont meg a basht keverned ossze, lehet python-szeru ciklusokat irni bele, meg shell parancsokat. Notificationt meg nem neztem, de eleg sokat tud.

Nem teljesen ertem, de valamiert itt a hupon az a trend, hogy normalis funkcionalitasu shellek hasznalata helyett az a cel, hogy valami 1970-es evekbeli szaron is fusson ugyanaz a script.

A strange game. The only winning move is not to play. How about a nice game of chess?