The issue is, the IP cached by ddns scipt is the LOCAL ip of my interfaces, instead of the real WAN interfaces. (It detects the correct public IPs while submitting in the update query.)
Thus everytime DDNS script runs, it will think an update is needed. Then the DDNS provider will reply no update needed.
I have check logs in /tmp/log/ddns, and cache files under /var/run/ddns
Here is the contents of the cached IPs (which is local IPs instead if public IPs.)
/tmp/run/ddns# cat /var/run/ddns/*ip
192.168.1.1
fdba:7b43:1916::1
When I have put that as my hostname in System settings, and using default DNS to check registered IP (that is the router itself), it will always report the local IPs.
After specifying using 8.8.8.8 for querying the registered IPs, the scripts are working fine.
Thank you for your input! It makes me to check the advanced options of the scipts.