About USB dongle-based, each and every USB Dongle that's commercially available has been cracked and there's a work-around for them. Doesn't matter what they tell you, the principle of USB dongles is flawed by design.
To make matters worse, once you've delivered your software product to a customer, it will be hacked if they consider the application valuable enough to take the time to hack it. Doesn't matter how strong it's protected, if the hacker has access to the binary contents, it will be hacked.
Also, many of your users will be honest people who will get annoyed by all this security stuff. If you choose for a solution that's extremely strong, you're actually inviting people not to use your software in it's proper, legal ways.
As noted before, be aware that you have to act conform the Linux licenses. Actually, you could be forced to provide your sourcecode for your application as open-source unless you can prove that you've worked according to the license.
However, there is a reasonable easy way to do periodic checks. Use CRON to start a call-home application at least once per day. It would call a web service on your webhost providing additional information about it's setup. As a response, your service tells it if it's still legal or not. If it's legal, no problem. If this check failed, just let the application report a message. If the call-home failed five times in a row or tells it's an illegal version then it's time to annoy the user. (But without breaking the usability of your application, else users become real unhappy.)
Now, the stuff that you want to protect might just continue to run without any changes. Or you alter them to check if the call-home application has tried to make contact already. If the user has disabled this process or tampered with it some other way, you could then block your applications too.
Or, to use the simplest option: create a special administrator account with almost full access rights. Don't let your clients run as Root.