{"id":382,"date":"2024-08-15T19:25:20","date_gmt":"2024-08-15T11:25:20","guid":{"rendered":"https:\/\/blog.kishere.cn\/?p=382"},"modified":"2025-07-29T10:36:03","modified_gmt":"2025-07-29T02:36:03","slug":"systemd","status":"publish","type":"post","link":"https:\/\/blog.kishere.cn\/?p=382","title":{"rendered":"systemd"},"content":{"rendered":"<h3>\u670d\u52a1\u5355\u5143\u6587\u4ef6<\/h3>\n<pre><code class=\"language-shell line-numbers\">[Unit]\nDescription=My Service\nAfter=network.target#\u6307\u5b9a\u670d\u52a1\u5e94\u5728\u5176\u4ed6\u670d\u52a1\u4e4b\u540e\u542f\u52a8\n[Service]\nType=simple#simple\u53ef\u4ee5\u8ba4\u4e3a\u662f\u524d\u53f0\u7a0b\u5e8f\nType=forking#forking\u7684\u7a0b\u5e8f\u4ee5deamon\u6a21\u5f0f\u8fd0\u884c\uff0c\u7279\u5f81\u662f\u4f1a\u6709\u4e00\u4e2a\u77ac\u95f4\u9000\u51fa\u7684\u7236\u8fdb\u7a0b\nExecStart=\/path\/to\/my-service#\u7a0b\u5e8f\u8def\u5f84\nRestart=on-failure#\u670d\u52a1\u5931\u8d25\u65f6\u7684\u91cd\u542f\u7b56\u7565\nStandardOutput=journal#\u663e\u793a\u5230journal\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528 journalctl -xe\u6765\u67e5\u770b\nStandardError=journal\n#StandardOutput=file:\/var\/log\/TesterD\/output.log#\u8f93\u51fa\u5230\u6587\u4ef6\n#StandardError=file:\/var\/log\/TesterD\/error.log\nUser=ubuntu#\u670d\u52a1\u5c06\u4ee5\u54ea\u4e2a\u7528\u6237\u548c\u7ec4\u7684\u8eab\u4efd\u8fd0\u884c\nGroup=ubuntu\n\n[Install]\nWantedBy=multi-user.target#\u6307\u5b9a\u670d\u52a1\u5728\u542f\u52a8\u65f6\u8981\u94fe\u63a5\u5230\u7684\u76ee\u6807\n<\/code><\/pre>\n<p>\u4fee\u6539\u5b8c\u540e\u8981\u6267\u884c<\/p>\n<pre><code class=\"language-shell line-numbers\">sudo systemctl daemon-reload\n<\/code><\/pre>\n<pre><code class=\"language-shell line-numbers\">systemctl start EXE.service\n<\/code><\/pre>\n<h3>\u5904\u7406\u4fe1\u53f7<\/h3>\n<p>\u7a0b\u5e8f\u4e2d\u9700\u8981\u5904\u7406systemd\u7684\u4fe1\u53f7\uff1a<\/p>\n<pre><code class=\"language-c line-numbers\">\/\/ File: myapp.cpp\n#include &lt;iostream&gt;\n#include &lt;fstream&gt;\n#include &lt;chrono&gt;\n#include &lt;thread&gt;\n#include &lt;csignal&gt;\n\n\/\/ Flag to control the running state of the application\nvolatile sig_atomic_t running = 1;\n\n\/\/ Signal handler to catch termination signals\nvoid signalHandler(int signum) {\n    running = 0;\n}\n\nint main() {\n    \/\/ Set up signal handling\n    std::signal(SIGTERM, signalHandler);\n    std::signal(SIGINT, signalHandler);\n\n    std::ofstream logFile(\"\/var\/log\/myapp.log\", std::ios::app);\n    if (!logFile.is_open()) {\n        std::cerr &lt;&lt; \"Failed to open log file\" &lt;&lt; std::endl;\n        return 1;\n    }\n\n    while (running) {\n        logFile &lt;&lt; \"Logging at: \" &lt;&lt; std::chrono::system_clock::now().time_since_epoch().count() &lt;&lt; std::endl;\n        logFile.flush();\n        std::this_thread::sleep_for(std::chrono::seconds(5));\n    }\n\n    logFile.close();\n    return 0;\n}\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u670d\u52a1\u5355\u5143\u6587\u4ef6 [Unit] Description=My Service After=network.target#\u6307\u5b9a\u670d\u52a1\u5e94\u5728\u5176\u4ed6\u670d\u52a1\u4e4b\u540e\u542f\u52a8 [Service] Type=simple#simple\u53ef\u4ee5\u8ba4\u4e3a\u662f\u524d\u53f0\u7a0b\u5e8f Type=forking#forking\u7684\u7a0b\u5e8f\u4ee5deamon\u6a21\u5f0f\u8fd0\u884c\uff0c\u7279\u5f81\u662f\u4f1a\u6709\u4e00\u4e2a\u77ac\u95f4\u9000\u51fa\u7684\u7236\u8fdb\u7a0b ExecStart=\/path\/to\/my-service#\u7a0b\u5e8f\u8def\u5f84 Restart=on-failure#\u670d\u52a1\u5931\u8d25\u65f6\u7684\u91cd\u542f\u7b56\u7565 StandardOutput=journal#\u663e\u793a\u5230journal\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u8c03\u7528 journalctl -xe\u6765\u67e5\u770b StandardError=journal #StandardOutput=file:\/var\/log\/TesterD\/output.log#\u8f93\u51fa\u5230\u6587\u4ef6 #StandardError=file:\/var\/log\/TesterD\/error.log User=ubuntu#\u670d\u52a1\u5c06\u4ee5\u54ea\u4e2a\u7528\u6237\u548c\u7ec4\u7684\u8eab\u4efd\u8fd0\u884c Group=ubuntu [Install] WantedBy=multi-user.target#\u6307\u5b9a\u670d\u52a1\u5728\u542f\u52a8\u65f6\u8981\u94fe\u63a5\u5230\u7684\u76ee\u6807 \u4fee\u6539\u5b8c\u540e\u8981\u6267\u884c sudo systemctl daemon-reload systemctl start EXE.service \u5904\u7406\u4fe1\u53f7 \u7a0b\u5e8f\u4e2d\u9700\u8981\u5904\u7406systemd\u7684\u4fe1\u53f7\uff1a \/\/ File: myapp.cpp #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;chrono&gt; #include &lt;thread&gt; #include &lt;csignal&gt; \/\/ Flag to control the running state of the application volatile sig_atomic_t running = 1; \/\/ Signal handler to catch termination signals void signalHandler(int signum) { running = 0; } int main() { \/\/ Set up signal handling std::signal(SIGTERM, signalHandler); std::signal(SIGINT, signalHandler); std::ofstream logFile(&#8220;\/var\/log\/myapp.log&#8221;, std::ios::app); if (!logFile.is_open()) { std::cerr &lt;&lt; &#8220;Failed to open log file&#8221; &lt;&lt; std::endl; return 1; } while (running) { logFile &lt;&lt; &#8220;Logging at: &#8221; &lt;&lt; std::chrono::system_clock::now().time_since_epoch().count() &lt;&lt; std::endl; logFile.flush(); std::this_thread::sleep_for(std::chrono::seconds(5)); } logFile.close(); return 0; }<\/p>\n","protected":false},"author":1,"featured_media":198,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=\/wp\/v2\/posts\/382"}],"collection":[{"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=382"}],"version-history":[{"count":5,"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=\/wp\/v2\/posts\/382\/revisions"}],"predecessor-version":[{"id":387,"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=\/wp\/v2\/posts\/382\/revisions\/387"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=\/wp\/v2\/media\/198"}],"wp:attachment":[{"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=382"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=382"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kishere.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=382"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}