{"id":1088,"date":"2024-12-18T11:09:27","date_gmt":"2024-12-18T03:09:27","guid":{"rendered":"http:\/\/www.chan.ink\/?p=1088"},"modified":"2024-12-18T11:22:33","modified_gmt":"2024-12-18T03:22:33","slug":"%e3%80%90linuxcrontab%e5%ae%9e%e8%b7%b5%e3%80%91%e6%95%b0%e6%8d%ae%e5%ba%93%e5%ae%9a%e6%97%b6%e5%a4%87%e4%bb%bd","status":"publish","type":"post","link":"http:\/\/www.chan.ink\/index.php\/2024\/12\/18\/%e3%80%90linuxcrontab%e5%ae%9e%e8%b7%b5%e3%80%91%e6%95%b0%e6%8d%ae%e5%ba%93%e5%ae%9a%e6%97%b6%e5%a4%87%e4%bb%bd\/","title":{"rendered":"\u3010Linux|crontab\u5b9e\u8df5\u3011\u6570\u636e\u5e93\u5b9a\u65f6\u5907\u4efd"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u4f7f\u7528\u7684\u547d\u4ee4\u5982\u4e0b<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">50 * * * * \/usr\/bin\/python3 \/home\/user\/backup_mysql.py >> \/home\/user\/backup.log 2>&amp;1<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u89e3\u91ca\uff1a\u6bcf\u4e2a\u5c0f\u65f6\u768450\u5206\u5f00\u59cb\u6267\u884c\u6b64\u547d\u4ee4<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">python\u811a\u672c\u5982\u4e0b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import os\nimport time\nfrom datetime import datetime\n\n# MySQL \u914d\u7f6e\nMYSQL_USER = 'root'           # MySQL \u7528\u6237\u540d\nMYSQL_PASSWORD = '123456'  # MySQL \u5bc6\u7801\nMYSQL_DATABASE = 'gx_day16'  # \u8981\u5907\u4efd\u7684\u6570\u636e\u5e93\u540d\u79f0\n\n# \u5907\u4efd\u6587\u4ef6\u5b58\u50a8\u8def\u5f84\nBACKUP_DIR = '\/home\/user\/mysql_backups'  # \u4fee\u6539\u4e3a\u672c\u5730\u5907\u4efd\u76ee\u5f55\n\n# \u8fdc\u7a0b\u670d\u52a1\u5668\u914d\u7f6e\nREMOTE_SERVER = '8.138.2.44'          # \u76ee\u6807\u670d\u52a1\u5668IP\u6216\u57df\u540d\nREMOTE_USER = 'root'              # \u76ee\u6807\u670d\u52a1\u5668\u7528\u6237\u540d\nREMOTE_DIR = '\/home\/remote_user\/backups'  # \u76ee\u6807\u670d\u52a1\u5668\u5b58\u50a8\u76ee\u5f55\n\n# \u786e\u4fdd\u672c\u5730\u5907\u4efd\u76ee\u5f55\u5b58\u5728\nif not os.path.exists(BACKUP_DIR):\n    os.makedirs(BACKUP_DIR)\n\n# \u751f\u6210\u5907\u4efd\u6587\u4ef6\u540d\uff08\u5e26\u65f6\u95f4\u6233\uff09\ntimestamp = datetime.now().strftime('%Y%m%d_%H%M%S')\nbackup_filename = f\"{MYSQL_DATABASE}_backup_{timestamp}.sql\"\nbackup_filepath = os.path.join(BACKUP_DIR, backup_filename)\n\n# \u6267\u884c mysqldump \u547d\u4ee4\u5907\u4efd\ntry:\n    print(\"\u5f00\u59cb\u5907\u4efd\u6570\u636e\u5e93...\")\n    dump_command = f\"mysqldump -u {MYSQL_USER} -p'{MYSQL_PASSWORD}' {MYSQL_DATABASE} > {backup_filepath}\"\n    os.system(dump_command)\n    print(f\"\u5907\u4efd\u5b8c\u6210\uff0c\u6587\u4ef6\u4fdd\u5b58\u5230: {backup_filepath}\")\nexcept Exception as e:\n    print(f\"\u5907\u4efd\u5931\u8d25\uff1a{str(e)}\")\n\n# \u540c\u6b65\u5907\u4efd\u6587\u4ef6\u5230\u8fdc\u7a0b\u670d\u52a1\u5668\ntry:\n    print(\"\u540c\u6b65\u5907\u4efd\u6587\u4ef6\u5230\u8fdc\u7a0b\u670d\u52a1\u5668...\")\n    sync_command = f\"scp {backup_filepath} {REMOTE_USER}@{REMOTE_SERVER}:{REMOTE_DIR}\"\n    os.system(sync_command)\n    print(f\"\u540c\u6b65\u5b8c\u6210\uff1a{REMOTE_SERVER}:{REMOTE_DIR}\")\nexcept Exception as e:\n    print(f\"\u540c\u6b65\u5931\u8d25\uff1a{str(e)}\")\n\n# \u53ef\u9009\uff1a\u5220\u9664\u8d85\u8fc77\u5929\u7684\u672c\u5730\u5907\u4efd\u6587\u4ef6\n#try:\n#    print(\"\u6e05\u7406\u8fc7\u65f6\u7684\u672c\u5730\u5907\u4efd\u6587\u4ef6...\")\n#    now = time.time()\n#    for file in os.listdir(BACKUP_DIR):\n#        file_path = os.path.join(BACKUP_DIR, file)\n#        if os.stat(file_path).st_mtime &lt; now - 7 * 86400:  # \u6587\u4ef6\u4fee\u6539\u65f6\u95f4\u8d85\u8fc77\u5929\n#            os.remove(file_path)\n#            print(f\"\u5220\u9664\u65e7\u5907\u4efd\u6587\u4ef6: {file_path}\")\n#except Exception as e:\n#    print(f\"\u6e05\u7406\u5931\u8d25\uff1a{str(e)}\")\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\/var\/log\u4e2d\u67e5\u770b\u6267\u884c\u60c5\u51b5<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"892\" height=\"663\" src=\"http:\/\/www.chan.ink\/wp-content\/uploads\/2024\/12\/1734490853660.png\" alt=\"\" class=\"wp-image-1089\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1707\" height=\"157\" src=\"http:\/\/www.chan.ink\/wp-content\/uploads\/2024\/12\/22e3d4233b2217ddabcc9d4c9ff53e4-1.png\" alt=\"\" class=\"wp-image-1091\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dec 18 10:50:01 hcss-ecs-dd47 CROND[6568]: (root) CMD (\/usr\/bin\/python3 \/home\/user\/backup_mysql.py >> \/home\/user\/backup.log 2>&amp;1 )<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u89e3\u91ca<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ece\u65e5\u5fd7\u5185\u5bb9\u53ef\u4ee5\u770b\u51fa\uff0c\u7cfb\u7edf\u5728 <strong>2024\u5e7412\u670818\u65e5 10:50:01<\/strong> \u6267\u884c\u4e86\u4e00\u6761\u7531 <code>CROND<\/code> \u8c03\u5ea6\u7684\u4efb\u52a1\u3002\u4efb\u52a1\u662f\u7531\u7528\u6237 <code>root<\/code> \u8fd0\u884c\u7684\uff0c\u6267\u884c\u7684\u547d\u4ee4\u662f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/usr\/bin\/python3 \/home\/user\/backup_mysql.py &gt;&gt; \/home\/user\/backup.log 2&gt;&amp;1<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u89e3\u91ca\uff1a<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4efb\u52a1\u5185\u5bb9<\/strong>\uff1a\u8fd0\u884c <code>\/home\/user\/backup_mysql.py<\/code> \u8fd9\u4e2a Python \u811a\u672c\u3002<\/li>\n\n\n\n<li><strong>\u65e5\u5fd7\u8f93\u51fa<\/strong>\uff1a\u5c06\u811a\u672c\u7684\u6807\u51c6\u8f93\u51fa\u548c\u9519\u8bef\u8f93\u51fa\u90fd\u91cd\u5b9a\u5411\u5230 <code>\/home\/user\/backup.log<\/code> \u6587\u4ef6\u4e2d\uff08\u901a\u8fc7 <code>>><\/code> \u548c <code>2>&amp;1<\/code>\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>>><\/code> \u8868\u793a\u8ffd\u52a0\u6a21\u5f0f\u5199\u5165\u65e5\u5fd7\u6587\u4ef6\uff0c\u4e0d\u4f1a\u8986\u76d6\u5df2\u6709\u5185\u5bb9\u3002<\/li>\n\n\n\n<li><code>2>&amp;1<\/code> \u8868\u793a\u628a\u6807\u51c6\u9519\u8bef\uff08stderr\uff09\u91cd\u5b9a\u5411\u5230\u6807\u51c6\u8f93\u51fa\uff08stdout\uff09\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u8fd9\u4e2a\u4efb\u52a1\u662f\u4f60\u8bbe\u7f6e\u7684\uff0c\u53ef\u4ee5\u68c0\u67e5 <code>backup_mysql.py<\/code> \u811a\u672c\u7684\u5185\u5bb9\uff0c\u786e\u4fdd\u5b83\u6b63\u786e\u5b9e\u73b0\u4e86 MySQL \u6570\u636e\u5e93\u7684\u5907\u4efd\u903b\u8f91\uff0c\u5e76\u786e\u8ba4 <code>\/home\/user\/backup.log<\/code> \u662f\u5426\u8bb0\u5f55\u4e86\u811a\u672c\u7684\u6267\u884c\u4fe1\u606f\uff08\u6bd4\u5982\u6210\u529f\u4e0e\u5426\u3001\u9519\u8bef\u65e5\u5fd7\u7b49\uff09\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u9700\u8fdb\u4e00\u6b65\u6392\u67e5\u95ee\u9898\uff0c\u53ef\u4ee5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u67e5\u770b\u65e5\u5fd7\u6587\u4ef6 <code>\/home\/user\/backup.log<\/code>\u3002<\/li>\n\n\n\n<li>\u68c0\u67e5\u811a\u672c <code>backup_mysql.py<\/code> \u662f\u5426\u6709\u95ee\u9898\u3002<\/li>\n\n\n\n<li>\u786e\u8ba4 <code>crontab<\/code> \u7684\u8c03\u5ea6\u662f\u5426\u6309\u7167\u9884\u671f\u8fd0\u884c\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u518d\u5230\u672c\u5730\u8ba1\u7b97\u673a\u7684\/home\/user\u4e0b\u67e5\u770b\u76f8\u5173\u6267\u884c\u65e5\u5fd7\u6587\u4ef6<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"883\" height=\"217\" src=\"http:\/\/www.chan.ink\/wp-content\/uploads\/2024\/12\/1734491081907.png\" alt=\"\" class=\"wp-image-1092\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1066\" height=\"276\" src=\"http:\/\/www.chan.ink\/wp-content\/uploads\/2024\/12\/1734491104203-1.png\" alt=\"\" class=\"wp-image-1094\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u770b\u51fa\uff0c\u63d0\u793a\u8fdc\u7a0b\u7684\u5907\u4efd\u670d\u52a1\u5668\u63d0\u793a\u6ca1\u6709\u8fd9\u4e2a\u76ee\u5f55\u548c\u6587\u4ef6\uff0c\u4f18\u5316\u6211\u4eec\u7684python\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import os\nimport time\nfrom datetime import datetime\n\n# MySQL \u914d\u7f6e\nMYSQL_USER = 'root'           # MySQL \u7528\u6237\u540d\nMYSQL_PASSWORD = '123456'     # MySQL \u5bc6\u7801\nMYSQL_DATABASE = 'gx_day16'   # \u8981\u5907\u4efd\u7684\u6570\u636e\u5e93\u540d\u79f0\n\n# \u5907\u4efd\u6587\u4ef6\u5b58\u50a8\u8def\u5f84\nBACKUP_DIR = '\/home\/user\/mysql_backups'  # \u672c\u5730\u5907\u4efd\u76ee\u5f55\n\n# \u8fdc\u7a0b\u670d\u52a1\u5668\u914d\u7f6e\nREMOTE_SERVER = '8.138.2.44'          # \u76ee\u6807\u670d\u52a1\u5668IP\u6216\u57df\u540d\nREMOTE_USER = 'root'                  # \u76ee\u6807\u670d\u52a1\u5668\u7528\u6237\u540d\nREMOTE_DIR = '\/home\/remote_user\/backups'  # \u76ee\u6807\u670d\u52a1\u5668\u5b58\u50a8\u76ee\u5f55\n\n# \u786e\u4fdd\u672c\u5730\u5907\u4efd\u76ee\u5f55\u5b58\u5728\nos.makedirs(BACKUP_DIR, exist_ok=True)\n\n# \u751f\u6210\u5907\u4efd\u6587\u4ef6\u540d\uff08\u5e26\u65f6\u95f4\u6233\uff09\ntimestamp = datetime.now().strftime('%Y%m%d_%H%M%S')\nbackup_filename = f\"{MYSQL_DATABASE}_backup_{timestamp}.sql\"\nbackup_filepath = os.path.join(BACKUP_DIR, backup_filename)\n\n# \u6267\u884c mysqldump \u547d\u4ee4\u5907\u4efd\ntry:\n    print(\"\u5f00\u59cb\u5907\u4efd\u6570\u636e\u5e93...\")\n    dump_command = f\"mysqldump -u {MYSQL_USER} -p'{MYSQL_PASSWORD}' {MYSQL_DATABASE} > {backup_filepath}\"\n    os.system(dump_command)\n    print(f\"\u5907\u4efd\u5b8c\u6210\uff0c\u6587\u4ef6\u4fdd\u5b58\u5230: {backup_filepath}\")\nexcept Exception as e:\n    print(f\"\u5907\u4efd\u5931\u8d25\uff1a{str(e)}\")\n\n# \u786e\u4fdd\u8fdc\u7a0b\u76ee\u5f55\u5b58\u5728\u5e76\u540c\u6b65\u5907\u4efd\u6587\u4ef6\u5230\u8fdc\u7a0b\u670d\u52a1\u5668\ntry:\n    print(\"\u68c0\u67e5\u5e76\u521b\u5efa\u8fdc\u7a0b\u76ee\u5f55...\")\n    # \u4f7f\u7528 SSH \u521b\u5efa\u8fdc\u7a0b\u76ee\u5f55\n    create_dir_command = f\"ssh {REMOTE_USER}@{REMOTE_SERVER} 'mkdir -p {REMOTE_DIR}'\"\n    os.system(create_dir_command)\n    print(f\"\u8fdc\u7a0b\u76ee\u5f55\u5df2\u786e\u8ba4\uff1a{REMOTE_DIR}\")\n    \n    print(\"\u540c\u6b65\u5907\u4efd\u6587\u4ef6\u5230\u8fdc\u7a0b\u670d\u52a1\u5668...\")\n    sync_command = f\"scp {backup_filepath} {REMOTE_USER}@{REMOTE_SERVER}:{REMOTE_DIR}\"\n    os.system(sync_command)\n    print(f\"\u540c\u6b65\u5b8c\u6210\uff1a{REMOTE_SERVER}:{REMOTE_DIR}\")\nexcept Exception as e:\n    print(f\"\u540c\u6b65\u5931\u8d25\uff1a{str(e)}\")\n\n# \u53ef\u9009\uff1a\u5220\u9664\u8d85\u8fc77\u5929\u7684\u672c\u5730\u5907\u4efd\u6587\u4ef6\ntry:\n    print(\"\u6e05\u7406\u8fc7\u65f6\u7684\u672c\u5730\u5907\u4efd\u6587\u4ef6...\")\n    now = time.time()\n    for file in os.listdir(BACKUP_DIR):\n        file_path = os.path.join(BACKUP_DIR, file)\n        if os.path.isfile(file_path) and os.stat(file_path).st_mtime &lt; now - 7 * 86400:  # \u6587\u4ef6\u4fee\u6539\u65f6\u95f4\u8d85\u8fc77\u5929\n            os.remove(file_path)\n            print(f\"\u5220\u9664\u65e7\u5907\u4efd\u6587\u4ef6: {file_path}\")\nexcept Exception as e:\n    print(f\"\u6e05\u7406\u5931\u8d25\uff1a{str(e)}\")\n-----------------------------------------------------------------<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u540c\u65f6\uff0c\u5c06crontab\u547d\u4ee4\u4fee\u6539\u4e3a\u6bcf10\u5206\u949f\u6267\u884c\u4e00\u6b21<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"900\" height=\"54\" src=\"http:\/\/www.chan.ink\/wp-content\/uploads\/2024\/12\/1734491443507.png\" alt=\"\" class=\"wp-image-1096\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">10\u5206\u949f\u540e<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"885\" height=\"169\" src=\"http:\/\/www.chan.ink\/wp-content\/uploads\/2024\/12\/1734492101637.png\" alt=\"\" class=\"wp-image-1101\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1074\" height=\"445\" src=\"http:\/\/www.chan.ink\/wp-content\/uploads\/2024\/12\/1734492127801.png\" alt=\"\" class=\"wp-image-1102\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b8c\u7ed3\u6492\u82b1\uff0c\u5b8c\u7f8e<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528\u7684\u547d\u4ee4\u5982\u4e0b 50 * * * * \/usr\/bin\/python3 \/home\/user\/backup_m [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1088","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/posts\/1088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/comments?post=1088"}],"version-history":[{"count":3,"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/posts\/1088\/revisions"}],"predecessor-version":[{"id":1104,"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/posts\/1088\/revisions\/1104"}],"wp:attachment":[{"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/media?parent=1088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/categories?post=1088"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.chan.ink\/index.php\/wp-json\/wp\/v2\/tags?post=1088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}