Ich schreibe ein Bash-Skript, in dem ich einen Handler geschrieben habe, der darauf achtet, wenn der Benutzer Strg + C drückt (mit trap interruptHandler SIGINT
), aber das SIGINT wird an beide Bash gesendet Skript und der untergeordnete Prozess, der gerade ausgeführt wird, schließen den untergeordneten Prozess. Wie kann ich das verhindern?Verhindern, dass SIGINT den untergeordneten Prozess im Bash-Skript schließt
edit: hier ist das Skript, nicht meine Fähigkeiten nicht zu viel Kritik ..
#!/bin/bash
trap "interruptHandler" SIGINT
inInterrupt=false;
quit=false;
if [ -z ${cachedir+x} ]; then cachedir=~/.cache/zlima12.encoding; fi
cachedir=$(realpath ${cachedir});
if [ ! -e ${cachedir} ]; then mkdir ${cachedir}; fi
if [ ! -e ${cachedir}/out ]; then mkdir ${cachedir}/out; fi
cleanCache()
{
rm ${cachedir}/*.mkv;
rm ${cachedir}/out/*.mkv;
}
interruptHandler()
{
if [ ${inInterrupt} != true ]; then
printf "BASHPID: ${BASHPID}";
inInterrupt=true;
ffmpegPID=$(pgrep -P ${BASHPID});
kill -s SIGTSTP ${ffmpegPID};
printf "\nWould you like to quit now(1) or allow the current file to be encoded(2)? ";
read response;
if [ ${response} = "1" ]; then kill ${ffmpegPID}; cleanCache;
elif [ ${response} = "2" ]; then quit=true; kill -s SIGCONT ${ffmpegPID};
else printf "I'm not sure what you said... continuing execution.\n"; kill -s SIGCONT ${ffmpegPID};
fi
inInterrupt=false;
fi
}
for param in "[email protected]"; do
dir=$(realpath ${param});
if [ ! -e ${dir} ]; then
printf "Directory ${dir} doesn't seem to exist... Exiting...\n"
exit 1;
elif [ -e ${dir}/new ]; then
printf "${dir}/new already exists! Proceed? (y/n) ";
read response;
if [ ${response} != y ]; then exit 1; fi
else
mkdir ${dir}/new;
fi
for file in ${dir}/*.mkv; do
filename="$(basename ${file})";
cp $file ${cachedir}/${filename};
ffmpeg -vsync passthrough -i ${cachedir}/${filename} -c:v libx265 -c:a copy -f matroska ${cachedir}/out/${filename};
rm ${cachedir}/${filename};
mv ${cachedir}/out/${filename} ${dir}/new/${filename};
if [ ${quit} = true ]; then exit 0; fi
done
done
(Dies ist ein Skript matroska (MKV) -Dateien in H.265, falls Sie neugierig zu kodieren)
Als beiseite, die langweilige 'if [-e $ {cachedir}]' Sequenz ersetzt werden kann, einfach mit 'mkdir -p "$ cachedir/out"'. Wenn alle Verzeichnisse vorhanden sind, tut es nichts; Wenn eine oder mehrere Pfadkomponenten fehlen, werden alle erstellt. Beachten Sie auch, wie die geschweiften Klammern völlig überflüssig sind, aber doppelte Anführungszeichen sind notwendig, um korrekt mit Verzeichnisnamen fertig zu werden, die Leerzeichen oder eine Anzahl anderer problematischer Zeichen enthalten. – tripleee