I often find when changing networks on my laptop to a theatre lighting network, some ETC software, particularly Concert, doesn’t work properly. ETC identifies the problem on their Technical Support Page, mentioning not only the port to release but also to try restarting SLPD. The problem appears to be Net3 discovery not properly finding devices on a network.

I got fed up having to do this manually in the Terminal, so I built a script to handle it for me. If you like to work in the Terminal, you can use the script from GitHub, or I have also wrapped it in an Automator Application if you want a quick fix. For the automator application you can download the latest application file from GitHub!
The script is reasonably simple, in that it shuts down SLPD if it is running and then restarts the process. The SLPD process can be easily grabbed by other processes (printers for example) and the whole thing can jam up the Net3 processes your ETC software needs.
I mostly only find this a problem on my personal laptop when I go from working on and off lighting networks. I’ve included two little helper scripts so that should the shutdown or startup process slow down you get some user feedback.
Here is the full script.
# etc_reset.zsh
# Version: 4.0
#
# A script for resetting all ports and protocols for ETC software.
# Designed particularly for use with ETC Concert.
#
# Created by Anthony Arblaster on 18 February 2025.
#
# Copyright Anthony Arblaster 2025.
# – Web: https://codebyanthony.com
# – Mastodon: https://mastodonapp.uk/@aarblaster
# – GitHub: https://github.com/aarblaster
#
# MIT Licence 2025
#
#!/bin/zsh
# Run reset on common ETC used ports.
function etc_reset() {
autoload -U colors && colors # All the colours
# Helper: live progress while waiting for SLPD to stop
wait_for_slpd_stop() {
local max_wait=10 # seconds
local interval=0.2
local elapsed=0
local bar_length=20
printf "Waiting for SLPD to stop: "
while pgrep -x "slpd" >/dev/null && (( $(echo "$elapsed < $max_wait" | bc -l) )); do
local progress=$((elapsed * bar_length / max_wait))
local filled=$(printf "%0.s#" $(seq 1 $progress))
local empty=$(printf "%0.s-" $(seq 1 $((bar_length - progress))))
printf "\rWaiting for SLPD to stop: [%s%s]" "$filled" "$empty"
sleep $interval
elapsed=$(echo "$elapsed + $interval" | bc)
done
echo ""
}
# Helper: live progress while waiting for SLPD to start
wait_for_slpd_start() {
local max_wait=10
local interval=0.2
local elapsed=0
local bar_length=20
printf "Waiting for SLPD to start: "
while ! pgrep -x "slpd" >/dev/null && (( $(echo "$elapsed < $max_wait" | bc -l) )); do
local progress=$((elapsed * bar_length / max_wait))
local filled=$(printf "%0.s#" $(seq 1 $progress))
local empty=$(printf "%0.s-" $(seq 1 $((bar_length - progress))))
printf "\rWaiting for SLPD to start: [%s%s]" "$filled" "$empty"
sleep $interval
elapsed=$(echo "$elapsed + $interval" | bc)
done
echo ""
}
echo "$fg_bold[blue]Checking SLPD status... $reset_color"
if pgrep -x "slpd" >/dev/null; then
echo "SLPD is running. Stopping it..."
/usr/local/bin/stopslpd
# Wait until it really stops (or timeout)
wait_for_slpd_stop
if pgrep -x "slpd" >/dev/null; then
echo "$fg_bold[red]Error: SLPD is still running. Try again. $reset_color"
return 1
else
echo "SLPD stopped successfully."
fi
else
echo "SLPD was not running."
fi
echo "$fg_bold[blue]Starting SLPD...$reset_color"
/usr/local/bin/slpd &>/dev/null &
wait_for_slpd_start
if pgrep -x "slpd" >/dev/null; then
echo "$fg_bold[green]SLPD started.$reset_color"
else
echo "$fg_bold[red]Error: Failed to start SLPD.$reset_color"
return 1
fi
}
This is a little example of a macOS script that makes my life just that little bit easier. Hopefully it helps you too.
