Ich entwickle QNAP-Pakete. Kann ich Unterstützung von QNAP-Entwicklern erhalten, wenn ich Fragen habe oder Bugs melden möchte?

An: QNAP-Mitarbeiter.

Der QNAP-Helpdesk bringt‘s einfach nicht. :disappointed_face:

Wie bekomme ich Unterstützung von kompetenten QNAP-Entwicklern? Ich weiß, dass es sie gibt.

Ich gebe wirklich mein Bestes, um QNAP weiterhin zu unterstützen, aber diese Interaktionen mit dem „Helpdesk“ sind einfach nur anstrengend. Das passiert viel zu oft. Ich mag mir gar nicht vorstellen, was andere Nutzer durchmachen.

Hast du schon versucht, es aus- und wieder einzuschalten?

Bisher ging es bei all meinen QNAP-Support-Anfragen um ausgefallene 10Gbit-Karten, aber das lief ziemlich unkompliziert ab, was das “Skript” angeht.

Ich bin überrascht, dass QNAP keinen Entwickler-Kanal für den Austausch anbietet.

Ich glaube, sein Problem liegt nicht bei der Support-App oder beim Helpdesk. Das Problem ist, dass die normalen Supportmitarbeiter keine Entwickler sind. Das ist einfach nicht ihr Arbeitsbereich. Deshalb gehen sie die Sache eher so an: „Der Nutzer hat ein Problem mit seinem System“, statt zu denken: „Das ist ein Entwicklungsproblem.“

Wie kann ich dir helfen oder wie lautet deine Ticketnummer? :wink:
Nur Spaß.
Aber im Ernst: Wie lautet deine Ticketnummer? Lass mich schauen, was ich tun kann, oder lass uns besprechen, was du brauchst.

Danke, Silas. :+1:

Ich suche nach einem Support-Kanal für technische Fragen rund um die Verwaltung von QPKG.

Hast du Vorschläge? Weißt du, ob eine Anmeldung als QNAP-Entwickler irgendwelche Unterstützung durch das QNAP-Team beinhaltet?

Wenn du Fragen zum Entwicklerkit hast, kannst du diese über dein ursprüngliches Bewerbungsticket stellen, nachdem du als einer unserer Entwickler freigeschaltet wurdest. Alternativ kannst du auch ein Support-Ticket eröffnen – bei entwicklungsbezogenen Fragen leitet unser Support-Team diese zur Klärung an die entsprechende Abteilung weiter. Vielen Dank!

Ich denke nicht. Aber ich kenne mich ziemlich gut mit dem QPKG-System aus und kann dir helfen.

Für alle, die eine App entwickeln wollen oder irgendetwas für QNAP entwickeln möchten, sage ich (weiß nicht wo), aber das Kompilieren für QTS6+ ist ziemlich einfach:

1) QTS 6 und QuTS hero basieren auf Ubuntu 24.04 / glibc.

Überprüfe es selbst auf dem Gerät: ldd --version zeigt 2.39 an. Das ist genau Ubuntu 24.04. Du brauchst also kein SDK, keine Cross-Toolchain und keinen Container für x86_64-Modelle. Einfach eine Ubuntu 24.04 VM installieren, dort bauen, Binary rüberkopieren, fertig. (Das gilt NICHT für QTS 5.x, das eine viel ältere glibc hat. Erst prüfen.)

2) Wähle ein Zielverzeichnis außerhalb von /opt.

# /opt gehört zu Entware. Wenn du Entware ein- oder ausschaltest, verschwinden deine Symlinks.
# Gib deiner App ein festes Verzeichnis und pack alles hinein:
MY_APP_DEST_DIR=/usr/bin/my_app

3) Die einzige wirklich wichtige Regel: Statische Abhängigkeiten, dynamische glibc.

Baue jede Library, die du brauchst, als statisches .a und linke sie in dein Binary. Nur glibc bleibt dynamisch.

  • NICHT full-static linken (-static). Das bricht NSS, sodass getaddrinfo() und Benutzer-Abfragen zur Laufzeit fehlschlagen.
  • NICHT eigene .so-Dateien ins /usr/lib auf der NAS kopieren. Das kollidiert mit QNAP-eigenen Libraries und kann Dinge zerstören, die nicht dir gehören.

4) Komplettes, echtes Beispiel: ncurses (Library) + htop (App).

SYSROOT=$HOME/build/sysroot          # privates Präfix für Libraries, nie auf der NAS installiert
MY_APP_DEST_DIR=/usr/bin/my_app      # wo die App auf der NAS liegen wird

# --- die Library: ncurses, nur statisch -------------------------------------
# --without-shared --with-normal : nur .a bauen, kein .so
# --enable-widec                 : libncursesw, UTF-8
# --with-fallbacks + --disable-db-install : Terminalbeschreibungen IN die Library kompilieren,
#                                  sodass du keine terminfo-Datenbank versenden musst
#                                  und es trotzdem auf einer blanken NAS funktioniert
cd ncurses-6.6
./configure --prefix=$SYSROOT \
  --without-shared --with-normal --enable-widec \
  --enable-pc-files --with-pkg-config-libdir=$SYSROOT/lib/pkgconfig \
  --with-fallbacks=xterm,xterm-256color,screen,linux,vt100,dumb \
  --disable-db-install \
  --without-debug --without-ada --without-cxx-binding --without-tests --without-manpages \
  CFLAGS="-O2 -pipe -fPIC"
make -j3 && make install             # landet in $SYSROOT, nicht im System

# --- die App: htop, gegen das statische ncurses gelinkt ---------------------
# PKG_CONFIG="pkg-config --static" : Libs.private ziehen, also die volle statische Endung
# PKG_CONFIG_LIBDIR=...            : NUR im sysroot suchen, nie bei Host-Libs
# --prefix                         : Pfad, den die App auf der NAS haben wird
# -static-libgcc                   : für C++-Apps auch -static-libstdc++ hinzufügen
cd ../htop-3.3.0
PKG_CONFIG="pkg-config --static" \
PKG_CONFIG_LIBDIR="$SYSROOT/lib/pkgconfig" \
./configure --prefix=$MY_APP_DEST_DIR --enable-unicode \
  CFLAGS="-O2 -pipe" \
  CPPFLAGS="-I$SYSROOT/include -I$SYSROOT/include/ncursesw" \
  LDFLAGS="-L$SYSROOT/lib -static-libgcc"
make -j3
make install DESTDIR=$PWD/../out     # Staging; DESTDIR + prefix = das Verzeichnis, das du versendest

--prefix ist der Pfad, den die Binary auf der NAS haben wird, DESTDIR ist das Staging-Verzeichnis auf der Build-Maschine. Halte sie getrennt, sonst sucht deine App ihre Config am falschen Ort.

5) Prüfe, bevor du etwas auf die NAS kopierst. Drei Kommandos für jedes Binary.

B=out/usr/bin/my_app/bin/htop

readelf -h $B | grep Machine
#   Advanced Micro Devices X86-64        <- richtige Architektur

readelf -d $B | grep NEEDED
#   libm.so.6, libc.so.6                 <- nur glibc. ncurses ist verschwunden: steckt im Binary.

objdump -T $B | grep -oE 'GLIBC_[0-9.]+' | sort -uV | tail -1
#   GLIBC_2.38                           <- max. 2.39, sonst startet das Binary auf der NAS nicht

Wenn NEEDED etwas auflistet, das nicht libc/libm/libpthread/libdl/librt/libresolv/ld-linux/libgcc_s ist,
hast du vergessen, diese Abhängigkeit statisch zu linken. Geh zurück und baue die Library um, nicht die App.

6) patchelf: für die eine Library, die du nicht statisch machen kannst.

Im Beispiel oben zieht htop immer noch libcap.so.2 vom Build-Host. Zwei echte Möglichkeiten:

Option A, Feature weg lassen: ./configure --disable-capabilities. Nichts mehr zu versenden.

Option B, Library im eigenen Verzeichnis ausliefern und das Binary darauf verweisen. Dafür gibt es patchelf,
und $ORIGIN ist der Teil, den viele übersehen: Es meint „das Verzeichnis, in dem dieses Binary liegt“, zur Laufzeit aufgelöst, und funktioniert egal, wo das Paket landet.

mkdir -p out/usr/bin/my_app/lib
cp -L /lib/x86_64-linux-gnu/libcap.so.2 out/usr/bin/my_app/lib/
patchelf --set-rpath '$ORIGIN/../lib' out/usr/bin/my_app/bin/htop
#         ^ einfache Anführungszeichen. Die Shell darf $ORIGIN NICHT expandieren.

readelf -d out/usr/bin/my_app/bin/htop | grep -E 'RUNPATH|NEEDED'
#   RUNPATH  [$ORIGIN/../lib]
ldd out/usr/bin/my_app/bin/htop | grep libcap
#   libcap.so.2 => .../my_app/bin/../lib/libcap.so.2      <- deine Kopie, nicht die systemeigene

Zwei weitere Tricks mit patchelf, die du kennen solltest:

patchelf --remove-rpath  $B                       # den absoluten Build-Maschinen-RPATH entfernen,
                                                  # den libtool gern einbackt (/home/du/build/...)
patchelf --replace-needed libfoo.so.1 libfoo.so.2 $B   # Binary umleiten, wenn es nicht neu gebaut werden kann

Beachte, dass RUNPATH nur Libraries auflöst, die du tatsächlich auslieferst. Damit holt man sich keine QNAP-Libraries — und das solltest du auch nicht tun: Die ändern sich zwischen Firmware-Versionen.

7) ARM-Modelle.

Gleiche Vorgehensweise, eine Zusatzzeile. Ubuntu 24.04 liefert die Cross-Compiler mit, also installiere
gcc-aarch64-linux-gnu oder gcc-arm-linux-gnueabihf und füge zu jedem ./configure
--host=aarch64-linux-gnu (oder arm-linux-gnueabihf) hinzu und exportiere
CC/CXX/AR/RANLIB/STRIP mit passendem Präfix. Alles andere, auch die drei Prüf-Kommandos, sind identisch. Hinweis für armv7: Die alten Marvell-Geräte haben kein NEON, also handgeschriebenes NEON-Assembly entweder zur Laufzeit erkennen oder abschalten.

Alles oben wurde unter Ubuntu 24.04 als End-to-End-Test gebaut und ausgeführt: ncurses 6.6 statisch,
htop 3.3.0, GLIBC_2.38 maximal, libcap per $ORIGIN/../lib verschoben, Binary startet und zeigt Version an.


Wenn du das QNAP QPKG ganz verstehen willst, installiere einfach StorageDiag Workbench & Utilities und schau dir im CmdHelper den Workflow rund um Start/Stop-Skripte genauer an:

Frag mich, was du brauchst – ich versuche es dir zu erklären.

Danke, Silas, da sind echt tolle Infos dabei. Ich wünschte, mehr Leute würden Beiträge posten, wie man so was macht. Wenn QNAP so hilfreich wäre, gäbe es bestimmt viel mehr QPKGs zum Installieren. :nerd:

Meine eigenen Pakete sind allerdings viel einfacher. In der Regel kompiliere ich nicht, aber ich muss lernen, wie man ein aktuelleres glibc paketiert, weil das mich daran hindert, einige andere Anwendungen zu verteilen.

libicu ist auch noch so ein Ding, das ich herausfinden muss.

Danke, Steve. :+1:

Da wir gerade beim Thema sind (als Partner-Entwickler): Ich nehme an, das bedeutet, dass die von mir eingereichten QPKGs von jemandem bei QNAP genehmigt oder abgelehnt werden müssen. Meine QPKGs enthalten häufig improvisierte Workarounds, um Probleme zu lösen, die ich im Laufe der Jahre in verschiedenen Versionen von QTS erlebt habe. Wird jemand bei QNAP daran Anstoß nehmen? Beispiel: QPKG-Signierung.

Zu Zeiten von QTS 4.x und 5.x habe ich einfach das gesamte glibc (aus einer Debian-VM) zusammen mit der Anwendung ausgeliefert, die ich verteilen wollte, und es war genau das glibc, gegen das ich die Anwendung kompiliert hatte.

So habe ich es zum Beispiel bei TVHeadend QPKG gemacht. „Speichertechnisch“ war das wahrscheinlich nicht die effizienteste Lösung, aber es hat funktioniert :grinning_face:

Ich mag es! :grin:

Wie bringst du die Anwendung dazu, deine spezifische glibc statt der systemeigenen zu verwenden? Das ist etwas, worüber ich nicht ganz im Klaren bin.

i got your point,
i would recommend you recompile instead going that way, because in such case you has to supply ld-library together and do some workaround…hmmm

# cat SoulseekCloud.sh
#!/bin/sh

NAME=SoulseekCloud
FRAMEWORK=QX11

export _DISPLAY=99

LOCK=/tmp/${NAME}.lock
_DEBUG=1

# Symbols
DOUBLE_LEFT_QUOTE_SYMBOL=$(echo -e "\xab")	; ASC_DLQ=$DOUBLE_LEFT_QUOTE_SYMBOL
DOUBLE_RIGHT_QUOTE_SYMBOL=$(echo -e "\xbb")	; ASC_DRQ=$DOUBLE_RIGHT_QUOTE_SYMBOL
GREATER_SYMBOL=$(echo -e "\x3e")		; ASC_GT=$GREATER_SYMBOL
LESS_SYMBOL=$(echo -e "\x3c")			; ASC_LT=$LESS_SYMBOL

# Normal Colors
black='\e[0;30m'        # Black
red='\e[0;31m'          # Red
green='\e[0;32m'        # Green
yellow='\e[0;33m'       # Yellow
blue='\e[0;34m'         # Blue
purple='\e[0;35m'       # Purple
cyan='\e[0;36m'         # Cyan
white='\e[0;37m'        # White

# Bold
bblack='\e[1;30m'       # Black
bred='\e[1;31m'         # Red
bgreen='\e[1;32m'       # Green
byellow='\e[1;33m'      # Yellow
bblue='\e[1;34m'        # Blue
bpurple='\e[1;35m'      # Purple
bcyan='\e[1;36m'        # Cyan
bwhite='\e[1;37m'       # White

# Background
on_black='\e[40m'       # Black
on_red='\e[41m'         # Red
on_green='\e[42m'       # Green
on_yellow='\e[43m'      # Yellow
on_blue='\e[44m'        # Blue
on_purple='\e[45m'      # Purple
on_cyan='\e[46m'        # Cyan
on_white='\e[47m'       # White

nc="\e[m"               # Color Reset

alert=${bwhite}${on_red} # Bold White on red background
warn=${black}${on_yellow} # Bold White on red background
notice=${black}${on_cyan} # Bold White on red background
info=${black}${on_green} # Bold White on red background

fd=0                    # stdin

DATE=`date +%Y-%m-%d`
NOW=`date +%Y%m%d_%H%M%S`

alias strip_esc='sed -r "s/\x1B[\[|\(]([0-9]{1,2}(;[0-9]{1,2})?)?[m|K|A|B|C|E|J|S|Z|H]//g"'

# interactive shell? then keep user attention on the err msg
if [ -t "$fd" ] || [ -p /dev/stdin ]; then
	echo -n ""
fi


function DEBUG()
{
	[ "$_DEBUG" == "1" ] && $@
}

_exit()
{
	echo -e "$*"
	echo

	# interactive shell? then keep user attention on the err msg
	if [ -t "$fd" ] || [ -p /dev/stdin ]; then
		echo -n "" ; sleep 1
		echo -n "" ; sleep 1
		echo -n "" ; sleep 1
		echo -n "" ; sleep 1
		echo -n "" ; sleep 1
	fi

	exit 1
}

available() {
	type -t "$1" >/dev/null && return 0
	return 1
}



# Message to terminal and system log
# ###########################################################################
_log() {
	local msg_type="info"
	local write_msg="/sbin/log_tool -t0 -u$NAME -p127.0.0.1 -mlocalhost -a"
	local message="$NAME: ${*:-"Unspecified Notice"}"

	[ "$_QUIET" != "1" ] && echo -e "(${green}$msg_type${nc}) $message"

#	message=`echo -e $message | strip_esc`

	# save to system Event Log only when in DEBUG mode
	[ "$_DEBUG" == "1" ] && $write_msg "($msg_type) $(echo -e $message | strip_esc)"
}

# Warning message to terminal and system log
# ###########################################################################
__warn() {
	local msg_type="warn"
	local message="$NAME: ${*:-"Unknown Warning"}"
	echo -e "(${red}$msg_type${nc}) "
}
_warn() {
	local msg_type="warn"
	local write_warn="/sbin/log_tool -t1 -u$NAME -p127.0.0.1 -mlocalhost -a"
	local message="$NAME: ${*:-"Unknown Warning"}" && $write_warn "($msg_type) $(echo -e $message | strip_esc)"

	echo -e "(${red}$msg_type${nc}) $message"
}

# Write error log message and exit
# ###########################################################################
__err(){
	local msg_type="err!"
	local message="$NAME: ${*:-"Unknown Error"}"

	_exit "(${alert}$msg_type${nc}) $message \n"
}
_err(){
	local msg_type="err!"
	local write_err="/sbin/log_tool -t2 -u$NAME -p127.0.0.1 -mlocalhost -a"
	local message="$NAME: ${*:-"Unknown Error"}" && $write_err "($msg_type) $(echo -e $message | strip_esc)"

	_exit "(${alert}$msg_type${nc}) $message \n"
}


function help()
{
	echo -e "------------------------------------------------------------------------------"
	echo -e " (${NAME}) PID: $$; (parent:${PPID})"
	echo -e "---------------------------------------------------------- || Hello World! ---"
	echo
	echo -e "  Usage:"
	echo -e "          ${white}$0${nc} (start|stop|restart)"
	echo
	echo -e "  Available options:"
	echo -e "    start/stop/restart        - start or stop chroot environment"
}


# Helper: Get script location
# ########################################
function _get_cwd()
{
	if [[ ${0:0:1} != "/" ]]; then
		CWD="$PWD"/$(dirname "$0")
	else
		CWD=$(dirname "$0")
	fi

	CWD=`cd "${CWD}" 2>/dev/null && pwd || echo "${CWD}"`
	ROOT="${CWD}"
}

_get_cwd
DEBUG echo Found current directory: "$CWD"
CWD=`getcfg -f /etc/config/qpkg.conf $NAME Install_Path`
DEBUG echo And app is installed in: "$CWD"
_PWD=`pwd`
cd "$CWD" 2>/dev/null 1>/dev/null

ROOTFS="${CWD}/rootfs"

SHARE_DOWNLOAD=/share/Download
SHARE_MULTIMEDIA=/share/Multimedia
$(cd "${SHARE_DOWNLOAD}" 2>/dev/null || _err Download share does not exist. Please enable multimedia functions or create it manually.)
$(cd "${SHARE_MULTIMEDIA}" 2>/dev/null || _err Multimedia share does not exist. Please enable multimedia functions or create it manually.)
SOULSEEK_DOWNLOAD_DIR="${SHARE_DOWNLOAD}/SoulseekCloud"
mkdir -p $SOULSEEK_DOWNLOAD_DIR 2>/dev/null 1>/dev/null
SOULSEEK_MULTIMEDIA_DIR="${SHARE_MULTIMEDIA}"


# Install my icons ...
# ###########################################################################
install_icons(){
	cp -af "$CWD/.qpkg_icon.gif" "/home/httpd/RSS/images/${NAME}.gif"		2>/dev/null
	cp -af "$CWD/.qpkg_icon_gray.gif" "/home/httpd/RSS/images/${NAME}_gray.gif"	2>/dev/null
	cp -af "$CWD/.qpkg_icon_80.gif" "/home/httpd/RSS/images/${NAME}_80.gif"		2>/dev/null
}
install_icons


RESULT=`/sbin/getcfg ${FRAMEWORK} Enable -u -d TRUE -f /etc/config/qpkg.conf`
if  [ "$RESULT" = "FALSE" ] ; then
	_err " ${FRAMEWORK} is disabled"
	exit 1
fi

RESULT=`/sbin/getcfg ${FRAMEWORK} Install_Path -d /null -f /etc/config/qpkg.conf`
QX11_PATH=${RESULT}/rootfs
if  [ ! -d "${QX11_PATH}" ] ; then
	_err " ${FRAMEWORK} is missing or not installed!. Please install ${FRAMEWORK} first! "
	exit 1
fi


case "$1" in
	"enable")
		/sbin/setcfg ${NAME} Enable TRUE -f /etc/config/qpkg.conf
	;;
	"disable")
		/sbin/setcfg ${NAME} Enable FALSE -f /etc/config/qpkg.conf
	;;
	"start")
		echo "- $NAME -- # QPKG Enable check"
		RESULT=`/sbin/getcfg ${NAME} Enable -u -d TRUE -f /etc/config/qpkg.conf`
		if  [ "$RESULT" = "FALSE" ] ; then
			echo " ${NAME} is disabled"
			exit 1
		fi

		echo "- $NAME -- # QPKG Running check"
		if [ -e ${LOCK} ] ; then
			echo " ${NAME} already Started $BASE "
			exit 1
		fi

		touch ${LOCK}

		[ -f "/etc/machine-id" ] || dbus-uuidgen > /etc/machine-id
		#locale-gen en_US.UTF-8

		SHARE_SOULSEEK=/share/Download/SoulseekCloud
		mkdir -p ${SHARE_SOULSEEK}/Music
		mkdir -p ${SHARE_SOULSEEK}/Soulseek\ Chat\ Logs
		mkdir -p ${SHARE_SOULSEEK}/Soulseek\ Downloads
		#[ -L /usr/share/novnc/logs ] || ln -s ${SHARE_SOULSEEK}/Soulseek\ Chat\ Logs /usr/share/novnc/logs
		#[ -L /usr/share/novnc/downloads ] || ln -s ${SHARE_SOULSEEK}/Soulseek\ Downloads /usr/share/novnc/downloads

		[ -d "${SHARE_SOULSEEK}/.SoulseekQt" ] || cp -af ${CWD}/config/default/.SoulseekQt "${SHARE_SOULSEEK}/"

		echo "- $NAME -- # QX11_framework_enable" ; /etc/init.d/QX11.sh enable
		echo "- $NAME -- # QX11_framework_start..." ; /etc/init.d/QX11.sh start
		/sbin/log_tool -t 0 -a "${NAME} in : Framework started on port 601${_DISPLAY} -> forwarded to 259${_DISPLAY}"

		#${CWD}/init.sh
		export pgid=1000
		export puid=1000
		export resize=scale
		export resolution=1920x1040

		export DISPLAY=":${_DISPLAY}"
		#[ -f /tmp/.X${_DISPLAY}-lock ] && rm /tmp/.${_DISPLAY}-lock 2>/dev/null 1>/dev/null

		export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
		export TEMP="/tmp"
		export TMP="/tmp"
		export TMPDIR="/tmp"
		export TERM="xterm"
		export EDITOR="/usr/bin/mcedit"
		export SHELL="/bin/sh"
		export LD_LIBRARY_PATH
		export LD_RUN_PATH
		export MC_HOME
		export MC_TMPDIR
		export WGETRC
		unset -v LD_LIBRARY_PATH
		unset -v LD_RUN_PATH
		unset -v MC_HOME
		unset -v MC_TMPDIR
		unset -v WGETRC


		export LANG=en_US.UTF-8
		export LANGUAGE=en_US:en
		export LC_ALL=en_US.UTF-8
		export XDG_RUNTIME_DIR=/share/Download/SoulseekCloud

		export FONTCONFIG_PATH="/usr/bin/QX11/etc/fonts/"

		export HOME="/share/Download/SoulseekCloud"
		export LD_RUN_PATH="${CWD}/app/lib"
		export LD_RUN="${CWD}/app/lib"
		export LD_LIBRARY_PATH="${CWD}/libc:${CWD}/app/lib:${QX11_PATH}/usr/lib/x86_64-linux-gnu/mesa:${QX11_PATH}/usr/lib/x86_64-linux-gnu:${QX11_PATH}/lib/x86_64-linux-gnu"
		#export LD_RUN_PATH=$LD_LIBRARY_PATH
		#echo $LD_LIBRARY_PATH

		#${CWD}/app/ld-2.19.so ${CWD}/app/SoulseekQt &
		${CWD}/app/ld-2.27.so ${CWD}/app/SoulseekQt &
		#${CWD}/app/ld-2.31.so ${CWD}/app/SoulseekQt &

		echo "app/SoulseekQt" > /var/run/QX11.SoulseekQt

		;;
	"stop")
		if [ ! -e ${LOCK} ] ; then
			echo " ( lock file not exist: ${LOCK} ) "
#			echo "Stop : Nothing to do ${POOL_NAME} not started."
#			exit 0
		fi

		kill `ps ax | grep SoulseekQt | grep -v grep | awk '{print $1}' 2>/dev/null`  2>/dev/null 1>/dev/null
		sleep 1
		sync
		kill -9 `ps ax | grep SoulseekQt | grep -v grep | awk '{print $1}' 2>/dev/null`  2>/dev/null 1>/dev/null
		sync

		rm ${LOCK} 2>/dev/null 1>/dev/null

		/sbin/log_tool -t 0 -a "${NAME} Stopped"
		;;
	"status")
		echo Process:
		ps ax | grep Soulseek | grep -v grep | grep -v container | grep -v "$(basename $0)"
		;;
	"restart")
		${CWD}/$0 stop
		/bin/sleep 2
		${CWD}/$0 start
		;;
	*)
		help
		echo
		echo Status
		${CWD}/$0 status
		exit 1
esac

# Parent process has died so we also better die.
exit 0

please look at start sequence
so i shipped my app together with own libc from other system


listen to me… this was for QTS <6.0
from now QTS is Ubuntu24 and you can compile anything you want and even just copy from Ubuntu24
if you wish me i can even writte some skills for claude/codex/copilot and others with instruction how to exactly compile and write compilation scripts if you want

the other way too do such things is native chroot and run app from chroot

but as i said - please avoid those two methods, are legacy from the moment when qts 6 goes out

Danke, Kumpel. :nerd_face:

Übrigens: Konntest du das schon auf QTS 6 testen? Scheint noch nicht verfügbar zu sein, selbst als Beta.

Könntest du bitte meine PM auf forum.qnap.net.pl beantworten?

Auf deine Frage: QuTS hero 6 verwendet bereits die neue glibc,
daher können wir erwarten, dass QTS 6 genauso ist :wink:

Ach, sorry, Kumpel, ich bin dort eigentlich nie unterwegs, deshalb wusste ich nicht, dass du mir geschrieben hast. Ich habe gerade geantwortet.

Du solltest jetzt auch auf diesem Forum private Nachrichten schicken können. :nerd_face: