A couple of slight imrovements to the code for getting CPU temps. Thanks to @bestboy for the research, it can now handle any number of cores. Also the actual temperature reading might be slightly more efficient.
I had earlier switched to the best solution recommended by @Stux for reading CPU temperature in spincheck.sh. Now, with refined, complete bash code suggested by @bestboy, the apparently more efficient method has been incorporated into all 3 of the scripts that read temperature.
If you want the gory details, instead of reading CPU temp from the IPMI, we are now reading it from sysctl. We use the hottest of up to 10 cores as CPU temperature. I used awk instead of cut to get the actual numbers from the sysctl output, not sure if that is much of an improvement.
In spinpid2.sh, the reading of duty cycles from the motherboard is now commented out (disabled) by default. Some boards report incorrect duty, and this causes the script to go bonkers. I have no idea how widespread this fault is, but there is really no harm in not asking the board for duty cycles - the script assumes the duty is what it sets. There is also some minor code cleanup.
spinpid.sh (the single-zone version) has some improvements in logic that make it work better. It holds drive temps better. Also after a CPU-intensive task, the fans can come down quickly as the CPU cools until the drives need cooling. I finally got it perfect. Also some minor cleanup.
The single-zone script had an issue that caused fan control based on drive temperatures to be inaccurate if the system went through a long period of high CPU use. That's fixed here, other scripts not updated.