diff --git a/services/actions/cleanup.go b/services/actions/cleanup.go
index 1223ebcab6..34fa2688e7 100644
--- a/services/actions/cleanup.go
+++ b/services/actions/cleanup.go
@@ -5,7 +5,9 @@ package actions
 
 import (
 	"context"
+	"errors"
 	"fmt"
+	"os"
 	"time"
 
 	actions_model "code.gitea.io/gitea/models/actions"
@@ -101,7 +103,7 @@ func CleanupLogs(ctx context.Context) error {
 			return fmt.Errorf("find old tasks: %w", err)
 		}
 		for _, task := range tasks {
-			if err := actions_module.RemoveLogs(ctx, task.LogInStorage, task.LogFilename); err != nil {
+			if err := actions_module.RemoveLogs(ctx, task.LogInStorage, task.LogFilename); err != nil && !errors.Is(err, os.ErrNotExist) {
 				log.Error("Failed to remove log %s (in storage %v) of task %v: %v", task.LogFilename, task.LogInStorage, task.ID, err)
 				// do not return error here, continue to next task
 				continue
diff --git a/services/actions/cleanup_test.go b/services/actions/cleanup_test.go
new file mode 100644
index 0000000000..65fae840c1
--- /dev/null
+++ b/services/actions/cleanup_test.go
@@ -0,0 +1,31 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package actions
+
+import (
+	"testing"
+
+	actions_model "code.gitea.io/gitea/models/actions"
+	"code.gitea.io/gitea/models/db"
+	"code.gitea.io/gitea/models/unittest"
+	"code.gitea.io/gitea/modules/timeutil"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func TestCleanup(t *testing.T) {
+	require.NoError(t, unittest.PrepareTestDatabase())
+
+	t.Run("Deletes no longer existing logs", func(t *testing.T) {
+		unittest.AssertSuccessfulInsert(t, &actions_model.ActionTask{ID: 1001, LogExpired: false, LogIndexes: []int64{1, 2, 3, 4}, LogFilename: "does-not-exist", Stopped: timeutil.TimeStamp(1)})
+
+		require.NoError(t, CleanupLogs(db.DefaultContext))
+
+		task := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionTask{ID: 1001})
+		assert.EqualValues(t, "does-not-exist", task.LogFilename)
+		assert.True(t, task.LogExpired)
+		assert.Nil(t, task.LogIndexes)
+	})
+}