Я пишу сценарий bash, в котором я написал обработчик, чтобы позаботиться о том, когда пользователь нажал Control + C (используя trap interruptHandler SIGINT
), но SIGINT отправляется как в bash скрипт и дочерний процесс, который в настоящее время запущен, закрывая дочерний процесс. Как я могу предотвратить это?Предотвращать закрытие дочернего процесса SIGINT в сценарии bash
редактировать: вот сценарий, не критиковать мои навыки слишком много ..
#!/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
(Это скрипт для кодирования Matroska (MKV) файлов H.265 в случае, если вам интересно)
В качестве альтернативы, утомительная последовательность 'if [-e $ {cachedir}] может быть заменена просто на' mkdir -p '$ cachedir/out ". Если все каталоги существуют, он ничего не делает; если один или несколько компонентов пути отсутствуют, он создает их все. Обратите внимание также, как скобки являются излишними, но для правильного управления именами каталогов, которые содержат пробелы или ряд других проблемных символов, необходимы двойные кавычки. – tripleee