diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index db87a5e20e7cb5724d6eda57cc72acfd11782455..fc9e220dd89afd4dad1b2e17370a130151bcc9c0 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -503,9 +503,8 @@ main(int argc, char **argv)
 
     if (params.daemonize) {
         daemonize();
-    } else if (params.service) {
-        setupSignals();
     }
+    setupSignals();
 
     auto node = std::make_shared<DhtRunner>();
 
@@ -576,7 +575,7 @@ main(int argc, char **argv)
 
     std::condition_variable cv;
     std::mutex m;
-    std::atomic_bool done {false};
+    bool done {false};
 
     node->shutdown([&]()
     {
@@ -587,7 +586,7 @@ main(int argc, char **argv)
 
     // wait for shutdown
     std::unique_lock<std::mutex> lk(m);
-    cv.wait(lk, [&](){ return done.load(); });
+    cv.wait(lk, [&](){ return done; });
 
     node->join();
 #ifdef WIN32_NATIVE
diff --git a/tools/tools_common.h b/tools/tools_common.h
index d0cb757be6d1334082feaff0f2f8c2a90bde4c03..a64a5b9fffde193a1d305bac0759d2e3fbb39145 100644
--- a/tools/tools_common.h
+++ b/tools/tools_common.h
@@ -282,18 +282,17 @@ readLine(const char* prefix = PROMPT)
 struct ServiceRunner {
     bool wait() {
         std::unique_lock<std::mutex> lock(m);
-        cv.wait(lock, [&]{return terminate;});
+        cv.wait(lock, [&]{return terminate.load();});
         return !terminate;
     }
     void kill() {
-        std::lock_guard<std::mutex> lock(m);
         terminate = true;
         cv.notify_all();
     }
 private:
     std::condition_variable cv;
     std::mutex m;
-    bool terminate = false;
+    std::atomic_bool terminate {false};
 };
 
 ServiceRunner runner;
@@ -340,7 +339,5 @@ void daemonize()
     close(STDIN_FILENO);
     close(STDOUT_FILENO);
     close(STDERR_FILENO);
-
-    setupSignals();
 #endif
 }