user2897: I would like to develop a Plutus script that executes each time an epoch ends.
What's the best way to achieve this behaviour?

user2537: Scripts are executed as part of a transaction validation. That means: no transaction -> no script execution. The blockchain has no mechanism of timed or automatic script execution. What you can do is to implement transaction submission at every new epoch in your off-chain code.

user1897: As mentioned by Jey earlier, blockchains and smart contracts remain latent until triggered by a user submitted transaction.
One way you could pull this off is that you could use the cardano-cli application to create, sign and submit a transaction which executed the plutus script at the end of every epoch. You can find out more about cardano-cli and plutus scripts here and a simple sample here
UPDATE: I realized that I missed out explaining how this could be done by creating an javascript bot which submits this kind of transaction near the end of the epoch automatically.
You can use the cardanocli-js javascript library to achieve this... here's a basic sample, but you can pretty much do any kind of action that the cardano-cli can do, in a programmatic submission.
Hope this helps!

2897: <p>I would like to develop a Plutus script that executes each time an epoch ends.</p>
<p>What's the best way to achieve this behaviour?</p>
 2537: <p>Scripts are executed as part of a transaction validation. That means: no transaction -&gt; no script execution. The blockchain has no mechanism of timed or automatic script execution. What you can do is to implement transaction submission at every new epoch in your off-chain code.</p>
 1897: <p>As mentioned by Jey earlier, blockchains and smart contracts remain latent until triggered by a user submitted transaction.</p>
<p>One way you could pull this off is that you could use the cardano-cli application to create, sign and submit a transaction which executed the plutus script at the end of every epoch. You can find out more about <a href="https://docs.cardano.org/plutus/Plutus-transactions" rel="nofollow noreferrer">cardano-cli and plutus scripts here</a> and a simple sample <a href="https://github.com/input-output-hk/Alonzo-testnet/blob/main/Alonzo-solutions/exercise3/e3SampleSolution.md" rel="nofollow noreferrer">here</a></p>
<p>UPDATE: I realized that I missed out explaining how this could be done by creating an javascript bot which submits this kind of transaction near the end of the epoch automatically.
You can use the <a href="https://github.com/Berry-Pool/cardanocli-js" rel="nofollow noreferrer">cardanocli-js</a> javascript library to achieve this... here's a <a href="https://developers.cardano.org/docs/get-started/cardanocli-js/" rel="nofollow noreferrer">basic sample</a>, but you can pretty much do any kind of action that the cardano-cli can do, in a programmatic submission.</p>
<p>Hope this helps!</p>
