首页
AI
测试
Search
1
Adobe GenP使用教程
351 阅读
2
PEA(Product Experience Assesment,产品体验评估)
209 阅读
3
DFX设计与实现
97 阅读
4
年后跳槽时间线
69 阅读
5
弱矩阵、强矩阵、 和平衡矩阵的区别
66 阅读
项目管理
产品管理
思想手册
E-Book
教程
Linux
Docker
MacOS
Windows
其他教程
sketch
Flask
python3
杂项
登录
Search
标签搜索
数据分析
电子书
变更
工作量评估
敏捷
模版
职级能力
debian11
Adobe
GenP
项目管理模版
香蕉你个不呐呐
累计撰写
158
篇文章
累计收到
0
条评论
首页
栏目
项目管理
产品管理
思想手册
E-Book
教程
Linux
Docker
MacOS
Windows
其他教程
sketch
Flask
python3
杂项
页面
AI
测试
搜索到
34
篇与
教程
的结果
2024-11-19
使用 APScheduler 来管理多个 Python 业务脚本
使用 APScheduler 来管理多个 Python 业务脚本的定时执行的详细示例和使用方法。 我们将使用一个简单的例子,然后逐步扩展到更复杂的情况。1. 安装 APScheduler:首先,你需要安装 APScheduler 库:pip3 install apscheduler2. 简单的例子 (单个任务):这个例子展示如何每分钟运行一个简单的函数:from apscheduler.schedulers.blocking import BlockingScheduler import time def my_job(): print("I'm working...") time.sleep(5) # 模拟任务执行时间 print("Job completed.") scheduler = BlockingScheduler() scheduler.add_job(my_job, 'interval', seconds=60) # 每分钟运行一次 scheduler.start()运行这个脚本,你会看到每分钟都会打印 "I'm working..." 和 "Job completed."。 BlockingScheduler 会阻塞主线程直到你手动停止它 (例如,使用 Ctrl+C)。3. 多个任务:你可以添加多个任务到同一个调度器中:from apscheduler.schedulers.blocking import BlockingScheduler import time def job1(): print("Job 1 is running...") time.sleep(2) print("Job 1 completed.") def job2(): print("Job 2 is running...") time.sleep(3) print("Job 2 completed.") scheduler = BlockingScheduler() scheduler.add_job(job1, 'interval', seconds=10) # 每 10 秒运行一次 scheduler.add_job(job2, 'cron', day_of_week='mon-fri', hour=10, minute=30) # 工作日 10:30 运行 scheduler.start()这个例子展示了如何使用不同的调度方式:interval (间隔时间) 和 cron (cron 表达式)。4. 使用不同的调度方式:APScheduler 支持多种调度方式:interval: 以固定的时间间隔运行任务。 参数包括 seconds, minutes, hours, days, weeks。cron: 使用 cron 表达式来指定任务运行的时间。 这提供了非常灵活的调度能力。 例如,'cron', day_of_week='mon-fri', hour=8, minute=0 表示工作日早上 8:00 运行。date: 在指定的时间点运行任务一次。其他: APScheduler 还支持其他调度方式,例如 trigger (自定义触发器)。5. 错误处理:在实际应用中,你的任务可能会失败。 你可以使用 try...except 块来处理异常:from apscheduler.schedulers.blocking import BlockingScheduler import time def my_job(): try: # 你的业务逻辑 print("Job is running...") # ... 可能出错的代码 ... 1 / 0 # 模拟一个错误 except Exception as e: print(f"Job failed: {e}") scheduler = BlockingScheduler() scheduler.add_job(my_job, 'interval', seconds=10) scheduler.start()6. 从外部文件导入任务:如果你的任务在不同的文件中,你可以从外部文件导入它们:# main.py from apscheduler.schedulers.blocking import BlockingScheduler import my_jobs scheduler = BlockingScheduler() scheduler.add_job(my_jobs.job1, 'interval', seconds=10) scheduler.add_job(my_jobs.job2, 'cron', day_of_week='mon-fri', hour=10, minute=30) scheduler.start() # my_jobs.py def job1(): print("Job 1 from external file") def job2(): print("Job 2 from external file")7. 停止调度器:你可以使用 scheduler.shutdown() 来优雅地停止调度器。8. 更高级的用法:APScheduler 还提供更高级的功能,例如:任务持久化: 将任务信息保存到数据库中,以便在调度器重启后恢复任务。作业存储: 使用不同的作业存储后端,例如数据库或文件系统。监听器: 添加监听器来监控任务的执行情况。记住将这些例子中的占位符函数替换成你实际的业务脚本函数。 根据你的业务脚本的复杂性和需求,选择合适的调度方式和错误处理机制。 如果你的任务之间存在依赖关系,你可能需要考虑使用更高级的调度功能或其他工具。
2024年11月19日
1 阅读
0 评论
0 点赞
2024-11-14
如何在生产环境中后台运行Gunicorn
本文细解释如何在生产环境中后台运行Gunicorn。 如何将 gunicorn --workers 3 --bind 0.0.0.0:9999 app:app 命令在后台稳定运行,并能够处理进程重启和优雅关闭等情况。直接使用 & 在后台运行是不够可靠的。我们需要借助进程监控工具来实现。常用的有两种:systemd(Linux系统推荐)和Supervisor(跨平台)。方法一:使用 systemd (推荐用于Linux)创建 systemd 服务文件: 在 /etc/systemd/system/ 目录下创建一个新的文件,例如 gunicorn.service。 文件内容如下:CodeCopy[Unit]Description=Gunicorn实例用于myappAfter=network.target[Service]User=你的用户名 # 替换成你的用户名Group=你的用户组 # 替换成你的用户组WorkingDirectory=/你的应用路径 # 替换成你的应用所在目录的绝对路径Environment="PATH=/你的虚拟环境路径/bin:$PATH" # 可选:如果你使用了虚拟环境ExecStart=/你的虚拟环境路径/bin/gunicorn --workers 3 --bind 0.0.0.0:9999 app:app如果你没有使用虚拟环境,请将上面一行替换为:ExecStart=/gunicorn的路径/gunicorn --workers 3 --bind 0.0.0.0:9999 app:appRestart=alwaysRestartSec=10[Install]WantedBy=multi-user.target请务必替换以下占位符:你的用户名: 你的Linux用户名。你的用户组: 你的Linux用户组。/你的应用路径: 包含你的Flask应用 (app.py) 文件的目录的绝对路径。例如 /home/user/myapp。/你的虚拟环境路径: 如果你使用了虚拟环境 (virtualenv),这是你的虚拟环境的 bin 目录的绝对路径。如果没有使用虚拟环境,请删除 Environment 行并修改 ExecStart 行。 /gunicorn的路径 指向gunicorn可执行文件的路径启用并启动服务: 保存文件后,执行以下命令:CodeCopysudo systemctl enable gunicorn.servicesudo systemctl start gunicorn.service检查状态: 使用以下命令检查 Gunicorn 是否正常运行:CodeCopysudo systemctl status gunicorn.service这将显示服务的运行状态,包括日志和错误信息。方法二:使用 Supervisor (跨平台)Supervisor 是一个更通用的进程监控工具,可在多种操作系统上运行。你需要先安装它(例如,在 Debian/Ubuntu 上使用 sudo apt-get install supervisor)。然后,你需要编辑 Supervisor 的配置文件(通常位于 /etc/supervisor/conf.d/gunicorn.conf),配置类似于 systemd 的例子,但语法不同。请参考 Supervisor 的文档了解具体的配置细节。重要注意事项:错误日志: Gunicorn 的日志对于调试至关重要。确保它们已正确配置并可访问。systemd 和 Supervisor 通常有记录服务输出的机制。进程管理: 在生产环境中,进程监控工具是必不可少的。它负责重启、优雅关闭和监控 Gunicorn 进程。安全性: 出于安全原因,请以非 root 用户运行 Gunicorn。虚拟环境: 强烈建议使用虚拟环境来隔离应用程序的依赖项。请仔细检查所有路径和用户名是否正确。选择 systemd 或 Supervisor 中的一种方法,不要同时使用两者。 在 Linux 系统上,通常推荐使用 systemd,因为它与操作系统集成得更好。 如果还有问题,请提供你的操作系统类型和 app.py 文件所在的目录。
2024年11月14日
6 阅读
0 评论
0 点赞
2024-11-13
优化
这段代码主要问题在于重复代码过多,以及路由处理方式不够优雅。 soft、device、wuhan 三个路由几乎完全相同,只是IP白名单和部分PM列表不同。gantt相关的路由也存在大量重复。 此外,错误处理可以更完善。以下提供优化方案:重构 IP 白名单:将 ip_whitelist 改为更易于管理的结构,例如字典嵌套列表:ip_whitelist = { 'soft': [ ('孔鲁文', "172.16.33.191"), ('李嘉政', "172.16.27.248"), # ... ], 'device': [ ('孔鲁文', "172.16.33.191"), # ... ], # ... }这样可以简化IP校验逻辑。创建辅助函数:创建辅助函数来处理重复的逻辑,例如:def process_project_data(ip_list, pm_list, remove_projects, is_normal): """处理项目数据,用于 soft, device, wuhan 路由""" removeTemoList = [f" name <> '{project}'" for project in remove_projects] removeProject = 'AND'.join(removeTemoList) joinTemp = [f" PmUserId = '{pm_id}'" for pm_name, pm_id, enabled in pm_list if enabled] PM = 'OR'.join(joinTemp) if joinTemp else "1=0" #避免空字符串导致错误 tempDatajson = { 'Normal': { 'count': None, 'DetailedList': SerachProject(PM, removeProject, True) }, 'over': { 'count': None, 'DetailedList': SerachProject(PM, removeProject, False) } } return render_template('base.html', tempDatajson=tempDatajson) # 创建一个 base.html 模板 def check_ip_and_auth(ip, ip_list, route_name): """检查IP地址和权限""" if ip in [ip_addr for _, ip_addr in ip_list]: whiteKeyName = [name for name, ip_addr in ip_list if ip_addr == ip][0] logger.info(f'{whiteKeyName} | {ip} 访问/{route_name}') return True else: logger.info(f'未授权 | {ip} 访问/{route_name}') return False def auth_required(func): """装饰器,用于检查权限""" def wrapper(*args, **kwargs): ip = request.remote_addr if not check_ip_and_auth(ip, ip_whitelist[kwargs['route_name']], kwargs['route_name']): return render_template("AuthFailed.html") return func(*args, **kwargs) return wrapper使用装饰器简化路由:使用装饰器 auth_required 来简化路由的权限检查:@app.route('/device', methods=['GET', 'POST']) @auth_required def device(): return process_project_data(ip_whitelist['device'], device_pm_list, remove_projects, True) @app.route('/soft', methods=['GET', 'POST']) @auth_required def soft(): return process_project_data(ip_whitelist['soft'], soft_pm_list, remove_projects, True) @app.route('/wuhan', methods=['GET', 'POST']) @auth_required def wuhan(): return process_project_data(ip_whitelist['wuhan'], wuhan_pm_list, remove_projects, True)你需要定义 device_pm_list, soft_pm_list, wuhan_pm_list 和 remove_projects 变量。重构 Gantt 路由:gantt 相关的路由也存在大量重复,可以提取公共部分:def handle_gantt(redis_name, pm_list, statement, template_name): today = datetime.now().strftime("%Y-%m-%d") redis_name = f'{redis_name}_{today}' try: random_string = request.args.get('token') if random_string == settings.gantt_tokens[template_name]: # 将token放到settings中 tempDatajson = project_gantt_public(redis_name, pm_list, statement) return render_template(template_name, tempDatajson=tempDatajson, today=today) else: return render_template("AuthFailed.html") except Exception as e: print(f"Error in gantt(): {e}") return "重新请求尝试" @app.route('/gantt', methods=['GET', 'POST']) def project_gantt_all_in_one(): return handle_gantt('project_gantt', ['李嘉政', '王清臣', ...], '', 'gantt.html') @app.route('/gantt_huishiyun', methods=['GET', 'POST']) def project_gantt_huishiyun(): return handle_gantt('project_gantt_huishiyun', ['李嘉政'], " AND a.ProjectBaseName NOT LIKE '%平台软件日常支撑(2024)%'", 'gantt.html') # ... 其他 Gantt 路由类似处理 ...在 settings.py 中定义 gantt_tokens 字典来存储每个 Gantt 路由的 token。改进错误处理:使用 Flask 的 errorhandler 装饰器来处理异常,提供更友好的错误页面。定时任务:定时任务部分代码可以优化,例如使用更简洁的数据库查询和数据处理方式。 可以考虑使用更强大的数据库ORM框架(如SQLAlchemy)来简化数据库操作。代码规范:使用更具描述性的变量名。保持代码缩进一致。添加必要的注释。总而言之,通过重构、提取公共方法、使用装饰器和改进错误处理,可以显著提高代码的可读性、可维护性和可扩展性。 记住,代码优化是一个迭代的过程,需要逐步改进。 我提供的方案是一个起点,你可以根据实际情况进行调整和完善。 你需要根据自己的需求创建 base.html 模板以及其他必要的修改。 也请确保你的 settings.py 文件包含了必要的配置信息。提供一个更结构化、更易于维护的代码框架,你需要根据你的实际环境和数据库配置进行调整。settings.py: import os # 数据库配置 DATABASE_URL = os.environ.get('DATABASE_URL') or '你的数据库连接字符串' # Redis 配置 REDIS_HOST = '192.168.10.100' REDIS_PORT = 6379 REDIS_PASSWORD = 'lijiazheng' REDIS_DB = 0 # 日志文件路径 LOG_FILE = '/home/bugsSerachZentao/logfile.log' LOG_MAX_BYTES = 1e6 LOG_BACKUP_COUNT = 3 # Gantt token gantt_tokens = { 'gantt.html': 'AoVv9Pba3sGjZoGEMjKgs6Bhaw29AaZnzMsEQdwHyqmWY_aio', 'gantt.html': 'N2ALqcECzjiZv9N6kJYBPBW9EJMNHVqL9QvtXTrCdZrmP_lijzh', 'gantt.html': '65KEq8sgQGUK8TQiUCB2MzZJjnlK7TVVevE8TZqk4WVBv_wqc', 'gantt.html': 'RaqWTAGqke46WHdmRep6N9g3fuGxQDPnjE973H7mCaYST_lcy', 'gantt.html': 'or8Alc3NZt9jx5fR79GFQdWrsDAqZDuCldAX4pDgimG73_platform', 'gantt.html': 'Qqu9w3fhJQfWd82U23Vpf8AoVUViYMevdexqQHC3FqERT_testing', 'test.html': 'test_46QYcgwBmmqAkRWL95VkH6aasd7WsYziQiChdWv4f3LbNcsfNGduudyDrgW5uUaV_test', 'iorz.html': '^gwUSSNwzUoRhgg7CZwSUQQUDiWG4XxZqT526DUgaaZhjb94Y95tTUz3w%%oc', 'ptyf.html': '^gwUSSNwzUoRhgg7CZwSUQQUDiWG4XxZqT526DUgaaZhjb94Y95tTUz3w%%oa', 'beziquePlus.html': 'V98cD8H7CZwSUQQUDiWG4XxZqT526DUgHGkHb94Y95t6Wz', } # ...其他配置... app.py: from flask import Flask, request, render_template, redirect from DBmodel.bugs import get_project_list # 假设这个模块存在 from DBmodel.info import zantao_project_baseInfo # 假设这个模块存在 import settings, warnings from logzero import logger, logfile from package.tools import Tools # 假设这个模块存在 from Model.project_info import SerachProject # 假设这个模块存在 from Model.timeLine import timelines # 假设这个模块存在 from Model.orz import orzs # 假设这个模块存在 from Model.ptyf import ptyfb # 假设这个模块存在 from Model.beziquePlus import bezique # 假设这个模块存在 from Model.project_gantt import gantt # 假设这个模块存在 from datetime import datetime from apscheduler.schedulers.background import BackgroundScheduler import redis, json from DBmodel.db_report_oa import MysqlDB # 假设这个模块存在 from decimal import Decimal from collections import defaultdict warnings.filterwarnings("ignore") # ... (IP 白名单部分,参考之前的重构方案) ... app = Flask(__name__) app.config.from_object(settings) redis_client = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, password=settings.REDIS_PASSWORD, db=settings.REDIS_DB) tools = Tools() logfile(settings.LOG_FILE, maxBytes=settings.LOG_MAX_BYTES, backupCount=settings.LOG_BACKUP_COUNT) # ... (辅助函数,参考之前的方案) ... # 路由 @app.route('/', methods=['GET', 'POST']) def index(): # ... (index 路由逻辑,参考之前的代码,简化重复部分) ... @app.route('/device', methods=['GET', 'POST']) @auth_required('device') def device(): return process_project_data(ip_whitelist['device'], device_pm_list, remove_projects, True, 'device.html') @app.route('/soft', methods=['GET', 'POST']) @auth_required('soft') def soft(): return process_project_data(ip_whitelist['soft'], soft_pm_list, remove_projects, True, 'soft.html') @app.route('/wuhan', methods=['GET', 'POST']) @auth_required('wuhan') def wuhan(): return process_project_data(ip_whitelist['wuhan'], wuhan_pm_list, remove_projects, True, 'wuhan.html') @app.route('/timeline', methods=['GET', 'POST']) def timeline(): tempDatajson = timelines() return render_template('timeline.html', tempDatajson=tempDatajson) @app.route('/orz', methods=['GET', 'POST']) @auth_required('jiaban') def orz(): tempDatajson = orzs() return render_template('orz.html', tempDatajson=tempDatajson) @app.route('/ptyf', methods=['GET', 'POST']) def ptyf(): # ... (ptyf 路由逻辑) ... @app.route('/beziquePlus', methods=['GET', 'POST']) def ptbeziquePlus(): # ... (beziquePlus 路由逻辑) ... @app.route('/gantt', methods=['GET', 'POST']) def project_gantt_all_in_one(): return handle_gantt('project_gantt', ['李嘉政', '王清臣', ...], '', 'gantt.html') @app.route('/gantt_huishiyun', methods=['GET', 'POST']) def project_gantt_huishiyun(): return handle_gantt('project_gantt_huishiyun', ['李嘉政'], " AND a.ProjectBaseName NOT LIKE '%平台软件日常支撑(2024)%'", 'gantt.html') # ... 其他 Gantt 路由 ... @app.route('/test', methods=['GET', 'POST']) def test(): return handle_gantt('project_gantt_huishiyun', ['李嘉政', '王清臣', ...], " AND a.ProjectBaseName NOT LIKE '%平台软件日常支撑(2024)%'", 'test.html') @app.route('/iorz', methods=['GET', 'POST']) @auth_required('jiaban') def iorz(): # ... (iorz 路由逻辑) ... # ... (错误处理) ... # ... (定时任务) ... if __name__ == '__main__': scheduler = BackgroundScheduler() scheduler.add_job(cron_OvertimeData, 'cron', hour=16, minute=37) scheduler.add_job(cron_getProjectTaskDetails, 'cron', hour=7, minute=30) scheduler.start() app.run(host='0.0.0.0', port=8080, debug=True) 其他模块 (Model, DBmodel 等):你需要根据你的实际情况完善这些模块。 确保你的数据库连接、数据模型以及其他依赖都正确配置。注意: 你需要替换占位符,例如数据库连接字符串,以及完善 device_pm_list, soft_pm_list, wuhan_pm_list, remove_projects 等变量,以及 handle_gantt 函数中的 pm_list 和 statement 参数。 还需要创建 base.html, device.html, soft.html, wuhan.html, gantt.html, test.html, iorz.html, timeline.html, ptyf.html, beziquePlus.html 等模板文件。 这个代码框架只是为了展示如何改进代码结构,你仍然需要根据你的实际需求进行调整和完善。 尤其要仔细检查数据库查询语句,避免SQL注入漏洞。 建议使用参数化查询来防止SQL注入。
2024年11月13日
5 阅读
0 评论
0 点赞
2024-11-13
Flask定时任务
方法一:使用 interval 参数 (每小时执行一次)from apscheduler.schedulers.background import BackgroundScheduler def cron_OvertimeData(): print('123') if __name__ == '__main__': scheduler = BackgroundScheduler() scheduler.add_job(cron_OvertimeData, 'interval', hours=1) # 每小时执行一次 scheduler.start() app.run(host='0.0.0.0', port=8080, debug=True)方法二:使用 cron 参数,更精确控制 (每小时的0分执行)from apscheduler.schedulers.background import BackgroundScheduler def cron_OvertimeData(): print('123') if __name__ == '__main__': scheduler = BackgroundScheduler() scheduler.add_job(cron_OvertimeData, 'cron', minute='0') # 每小时的0分执行 scheduler.start() app.run(host='0.0.0.0', port=8080, debug=True)方法三:结合 date 参数,设置起始时间和结束时间 (每小时执行一次,持续10小时)from apscheduler.schedulers.background import BackgroundScheduler from datetime import datetime, timedelta def cron_OvertimeData(): print('123') if __name__ == '__main__': scheduler = BackgroundScheduler() start_time = datetime.now() end_time = start_time + timedelta(hours=10) #运行10小时 scheduler.add_job(cron_OvertimeData, 'interval', hours=1, start_date=start_time, end_date=end_time) scheduler.start() app.run(host='0.0.0.0', port=8080, debug=True)重要提示: 这些代码片段都假设你已经安装了 APScheduler 库 (pip install apscheduler),并且你的代码中已经存在 app 对象 (例如,Flask 应用)。 你需要根据你的实际应用环境进行调整。 特别是 app.run() 部分,需要根据你的Web框架进行修改。 如果你的应用不是基于Flask,你需要替换成你的框架的运行方法。 另外,确保你的程序能够持续运行,否则定时任务将无法正常执行。 在生产环境中,建议使用更健壮的进程管理工具来保证程序的稳定运行。是的,APScheduler 提供了更丰富的功能,可以补充到之前的例子中,使定时任务更加强大和灵活。以下是一些补充用法:1. 任务参数传递:你可以向定时任务函数传递参数:from apscheduler.schedulers.background import BackgroundScheduler from datetime import datetime, timedelta def my_task(param1, param2): print(f"Task executed with parameters: {param1}, {param2}") if __name__ == '__main__': scheduler = BackgroundScheduler() scheduler.add_job(my_task, 'interval', hours=1, args=['hello', 123]) scheduler.start() # ... your app.run() ...2. 任务ID和替换:你可以为每个任务分配一个ID,方便管理和替换:from apscheduler.schedulers.background import BackgroundScheduler def my_task(): print("Task executed") if __name__ == '__main__': scheduler = BackgroundScheduler() job = scheduler.add_job(my_task, 'interval', hours=1, id='my_unique_job_id') # ... later, you can replace the job ... scheduler.remove_job('my_unique_job_id') new_job = scheduler.add_job(my_task, 'interval', hours=2, id='my_unique_job_id') scheduler.start() # ... your app.run() ...3. 任务的暂停和恢复:你可以暂停和恢复特定的任务:from apscheduler.schedulers.background import BackgroundScheduler def my_task(): print("Task executed") if __name__ == '__main__': scheduler = BackgroundScheduler() job = scheduler.add_job(my_task, 'interval', hours=1, id='my_job') # ... later, pause the job ... job.pause() # ... later, resume the job ... job.resume() scheduler.start() # ... your app.run() ...4. 错误处理:使用 misfire_grace_time 参数设置任务错过执行时间的容忍时间,避免因为短暂的延迟而导致任务丢失:from apscheduler.schedulers.background import BackgroundScheduler def my_task(): print("Task executed") if __name__ == '__main__': scheduler = BackgroundScheduler() scheduler.add_job(my_task, 'interval', hours=1, misfire_grace_time=60) # 允许延迟60秒 scheduler.start() # ... your app.run() ...5. 使用不同的调度器:除了 BackgroundScheduler,APScheduler 还提供了 BlockingScheduler (阻塞调度器,适合简单的脚本) 和 AsyncIOScheduler (异步调度器,适合异步环境)。 选择合适的调度器取决于你的应用架构。6. 监听事件:APScheduler 提供了事件监听机制,可以让你在任务执行前、执行后或出现错误时执行相应的操作:from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR def my_listener(event): if event.exception: print(f"Job {event.job_id} failed: {event.exception}") else: print(f"Job {event.job_id} executed successfully") if __name__ == '__main__': scheduler = BackgroundScheduler() scheduler.add_job(my_task, 'interval', hours=1, id='my_job') scheduler.add_listener(my_listener, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR) scheduler.start() # ... your app.run() ...这些补充用法可以让你更精细地控制定时任务的执行,并处理各种异常情况。 选择哪些用法取决于你的具体需求。 记住查阅 APScheduler 的官方文档以获取更详细的信息和更多高级功能。
2024年11月13日
3 阅读
0 评论
0 点赞
2024-03-25
禅道 mysql 远程连接_远程访问禅道开源版数据库(基于docker)
navicat访问基于docker搭建的禅道的数据库,报错”2003 can't connect to MySQL server on '' (10061 'unknown error')“一.开启3306端口映射为了能够远程访问数据库,在运行镜像的时候需要把容器的3306端口映射到宿主机的3306端口docker run --name zentao -p 80:80 -p 3306:3306 -v /data/www:/app/zentaopms -v /data/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=jc5201314.# -d zentao:latest查看端口是否映射,执行命令:docker ps可以看到容器的3306端口映射到宿主机上:也可以使用lsof命令查看端口状态:lsof -i:3306二.开启mysql远程访问进入docker容器docker exec -it zentao /bin/bash找到MariaDB的配置文件"/etc/mysql/mariadb.conf.d/50-server.cnf",把"bind-address...."一行注释掉接下来还要给账户分配权限,进入mysql命令行界面,输入:select User, host from mysql.user;host项的localhost表示该账户只能本地登录:输入命令修改host(password字段为数据库密码):GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;保存更改:FLUSH PRIVILEGES;执行完之后再次查看host项:因为docker每次重启都会用image镜像重新创建容器,所以不能直接重启docker,直接重启会导致设置失效。利用commit命令将容器生成一个新的镜像(container修改为自己的容器id)docker commit 'containerid' zentao2关闭旧的容器:docker kill zentao删除旧的容器:docker rm zentao用新镜像生成新的容器:docker run --name zentao -p 80:80 -p 3306:3306 -v /data/www:/app/zentaopms -v /data/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=jc5201314.# -d zentao2连接成功!
2024年03月25日
15 阅读
0 评论
0 点赞
2024-03-21
debian 安装redis
在Debian系统上安装Redis通常很简单,可以通过apt包管理器进行安装。以下是在Debian系统上安装Redis的步骤:更新软件包索引:在终端中执行以下命令,以确保你的apt包管理器已经更新到最新版本的软件包列表:sudo apt update安装Redis服务器:使用以下命令安装Redis服务器:sudo apt install redis-server这将安装Redis服务器和相关的依赖项。启动Redis服务:安装完成后,Redis服务可能会自动启动。如果没有自动启动,你可以手动启动Redis服务:sudo systemctl start redis-server验证Redis服务是否运行:你可以使用以下命令检查Redis服务是否正在运行:sudo systemctl status redis-server如果Redis正在运行,你应该会看到类似于以下内容的输出:yamlCopy code ● redis-server.service - Advanced key-value store Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2022-03-26 10:32:12 UTC; 1min 30s ago Docs: http://redis.io/documentation, man:redis-server(1) Main PID: 1234 (redis-server) Status: "Ready to accept connections" Tasks: 4 (limit: 1123) Memory: 864.0K CGroup: /system.slice/redis-server.service └─1234 /usr/bin/redis-server 127.0.0.1:6379如果状态显示为"active (running)",则表示Redis服务器正在运行。设置Redis开机自启动(可选):如果你想让Redis在系统启动时自动启动,可以使用以下命令将其添加到系统启动项中:sudo systemctl enable redis-server通过以上步骤,你应该已经成功在Debian系统上安装和启动了Redis服务器。你可以通过连接到本地主机的6379端口来访问Redis服务。
2024年03月21日
16 阅读
0 评论
0 点赞
2024-02-28
TK赛道
为什么要做TK的核心原因:TK面向全球156个国家,人流量巨大,但是目前在TK拥有带货权限的人数却不多,竞争力很小,同时可以搬运国内抖音视频消重二次创作后直接发布到TK,无需原创,无需懂英文,非常适合新手小白快速起号变现;快速涨粉搬运视频要素:通过关键词搜索法或创作灵感法找到热门视频,先去水印,然后通过二次创作后就可发布到TK,二次创作的内容后面会结合运营方法教你,第一节课只掌握【去水印】技能即可;新号起号准备工作:先做账号定位,确定要做的账号类型(推荐选择好物赛道),设置头像、昵称,然后根据赛道类型刷相应视频打标签,这些内容不需要现在全部掌握,先有一个整体的逻辑框架,后面会一步步带你去操作。三分靠运营,七分靠选品。选品的误区:跟风选品,凭个人感觉选品这种都是不对的;选品两大招:数据分析选品、节假日选品(需用到专业选品工具,昨晚钱程老师讲解的灰豚数据是针对于国内抖音的市场数据分析网站,先做基本了解即可,后面要用到专门针对TK的市场数据分析网站,前期小白阶段把握不准可售卖本公司专业选品部推荐的爆款产品),同时国外商品售价更高,且以美金结算收益,咱们带货利润也更高;货源平台:短视频带货可直接用官方“精选联盟”供货平台,开小店卖货可用“千帆联盟”供货平台,都无需囤货压货,佣金更高,两个平台都可以通过我们加壹教育进行入驻,个人无法入驻;剪辑视频:通过关键词搜索法进行筛选视频,找到想要搬运的视频,视频时长控制在30秒以内,剪掉啰嗦多余的视频内容,添加适合的音乐文字,每个人剪辑思路不同,剪辑出来的视频都是独一无二的;(这部分的内容只掌握关键词搜索法即可,其余的先做了解,后面会结合运营方法教给你,剪辑技能只掌握最基础的方法就行,运营方法才是核心);IOS手机下载tk一、手机设备准备:苹果6 32G以上注意:做tiktok需要准备一台专用手机,该手机不能下载国内任何的软件。二、操作前的设置1、苹果系统更新到14.2版本以上2、将手机恢复出厂设置处理3、关闭手机定位功能三、打开限制广告追踪在苹果手机的设置-隐私-广告里面设置,低版本手机显示的是限制广告追踪,打开变绿,把个性化广告设置打开。四、设置语言和时区在设置——通用——语言和地区里面,将语言设置为English,地区设置为United States。记得在系统里把自动设置时区给关掉,然后设置成你需要的时区。时区就看ip城市所在时区。如果是在洛杉矶,就选Los Angeles。五、注册美区ID打开http://appleid.com在苹果官网注册在AppStore填写付款信息即可申请注册六、下载软件facebook、instagram、Twitter、AirDroid、TikTok等七、下载注册tiktok登录美区ID,打开苹果应用商店即可下载
2024年02月28日
15 阅读
0 评论
0 点赞
2024-01-29
PMP续证指导文件(最新版)
在续证过程中,有任何疑问,欢迎拨打PMI 中国热线电话010 8429 9288
2024年01月29日
10 阅读
0 评论
0 点赞
2024-01-27
群晖安装pip3
python3 -m ensurepip --default-pip pip3 install tqdm --trusted-host pypi.tuna.tsinghua.edu.cn
2024年01月27日
7 阅读
0 评论
0 点赞
2024-01-27
sonoma壁纸
暂无简介
2024年01月27日
10 阅读
0 评论
0 点赞
2024-01-27
typora样式主题修改(样式附件)
打开Typora的主题文件夹,解压文件后重新打开主题即可。展示效果样式备份下载隐藏内容,请前往内页查看详情
2024年01月27日
16 阅读
0 评论
0 点赞
2024-01-26
直播策划案及任务执行表
直播策划案及任务执行表.xlsx
2024年01月26日
4 阅读
0 评论
0 点赞
2024-01-24
picgo 配置 lankong图床
下载picGOhttps://github.com/Molunerfinn/PicGo/releases则需下载对应的版本:PicGo-2.4.0-beta.6-arm64.dmgPicGo-2.4.0-beta.6-x64.dmgPicGo-2.4.0-beta.6.AppImagePicGo-Setup-2.4.0-beta.6-ia32.exePicGo-Setup-2.4.0-beta.6-x64.exePicGo-Setup-2.4.0-beta.6.exepicgo_2.4.0-beta.6_amd64.snapmacos下需要安装nodejs使用brew安装sloot@slootdeMBP ~ % brew install nodejs Running `brew update --auto-update`... Warning: No remote 'origin' in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-services, skipping update! Installing from the API is now the default behaviour! You can save space and time by running: brew untap homebrew/core brew untap homebrew/cask ==> Auto-updated Homebrew! Updated 2 taps (homebrew/core and homebrew/cask). ==> New Formulae limesuite nowplaying-cli scnlib ==> New Casks bitbox bugdom2 insomnium lyricsfinder nightshade You have 3 outdated formulae installed. ==> Fetching dependencies for node: c-ares, libnghttp2 and libuv ==> Fetching c-ares ==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/c-ares-1.25.0.sonoma.bottle.tar.gz #################################################################################################################################################################################### 100.0% ==> Fetching libnghttp2 ==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/libnghttp2-1.59.0.sonoma.bottle.tar.gz #################################################################################################################################################################################### 100.0% ==> Fetching libuv ==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/libuv-1.47.0.sonoma.bottle.tar.gz #################################################################################################################################################################################### 100.0% ==> Fetching node ==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/node-21.6.1.sonoma.bottle.tar.gz #################################################################################################################################################################################### 100.0% ==> Installing dependencies for node: c-ares, libnghttp2 and libuv ==> Installing node dependency: c-ares ==> Pouring c-ares-1.25.0.sonoma.bottle.tar.gz 🍺 /usr/local/Cellar/c-ares/1.25.0: 156 files, 1016.4KB ==> Installing node dependency: libnghttp2 ==> Pouring libnghttp2-1.59.0.sonoma.bottle.tar.gz 🍺 /usr/local/Cellar/libnghttp2/1.59.0: 13 files, 746.9KB ==> Installing node dependency: libuv ==> Pouring libuv-1.47.0.sonoma.bottle.tar.gz 🍺 /usr/local/Cellar/libuv/1.47.0: 19 files, 1MB ==> Installing node ==> Pouring node-21.6.1.sonoma.bottle.tar.gz 🍺 /usr/local/Cellar/node/21.6.1: 2,233 files, 64.5MB ==> Running `brew cleanup node`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).picGO进行安装插件如图进行插件的安装如图进行参数配置tokens 获取# 使用curl请求接口,获取tokens curl -X POST \ -H "Content-Type: application/json" \ -d '{"email": "user_email", "password": "password"}' \ https://domain.com/api/v1/tokens # 返回值 {"status":true,"message":"success","data":{"token":"8|9g3ZXiIoAaVR6Y5xEdKaFtdEyjFQU1x2"}}% 填写后,进行测试正常即可。配置Typora进行图片上传,如下。
2024年01月24日
12 阅读
0 评论
0 点赞
2024-01-20
Mac OS自带了apache,基本用法总结
想着如何在Mac OS下部署静态网页(纯粹的html,css,js),用惯了windows下的iis,可惜Mac OS下也许只能通过Tomcat或者Apache之类的作为部署容器。听说Mac OS下自带了apache,于是就折腾起来。 环境:sonoma14.2.1找到apache藏身之所系统默认是隐藏apache安装目录的,但我们可以通过“命令行”或者“文件夹前往”的方式找到它。它是安装在系统的私有目录下,也就是/private/etc下面,因为它是隐藏的,所以我们无法通过界面找到它。 ps:/ect目录是mac os 系统存放系统配置信息的地方,里面都是xxx.conf的配置文件。 命令行 在终端输入 如下 命令即可打开它的“住所”了。请看:cd /etc/apache2 open .apache下部署web资源跟windows不一样,它的部署包不是放在htdocs(windows下的存放目录),而是放在 “/Library/WebServer/Documents”下面:cd /Library/WebServer/Documents open .那么我们的静态资源就可以丢到这个目录下去了。 这个目录是apache的默认目录,有时候为了方便操作,可能需要指向特定的文件夹,该如何修改apache的配置呢?启动停用apache启用apache的命令: sudo apachectl start/restart 如果需要password,输入即可,如果启动失败了,就可以去看apache的日志,找到错误的原因(前提是在httpd.conf中配置了日志的路径) 在浏览器中输入localhost或者127.0.0.1即可看到“It works!”的提示。恭喜,apache启动成功了。停止apache的命令是:sudo apachectl stop
2024年01月20日
12 阅读
0 评论
0 点赞
2024-01-20
macOS 文字转语音命令 say
简单调用在mac的命令行下面,执行:say hello world就可以发出"hello world"的声音了,支持中文。文字转为语音新建一个文本文件aa.txt,在终端里在,cd 到该目录,然后执行:say -f aa.txt -o a.m4a即可生成a.m4a这个语音文件。 -f 后面跟的是需要转换成语音的文件,-o 是 -out 的意思。修改语音声音打开系统偏好设置->辅助功能->语音
2024年01月20日
14 阅读
0 评论
0 点赞
2024-01-20
MacOS 设置定时任务
在 macOS 上,你可以使用 launchd 来设置定时任务。下面是设置定时任务的一般步骤:1. 创建脚本:首先,创建一个包含你要执行的任务的脚本文件。确保脚本有执行权限。# 例如,创建一个简单的 Bash 脚本 echo "#!/bin/bash" > /path/to/your/script.sh echo "echo 'Hello, World!'" >> /path/to/your/script.sh chmod +x /path/to/your/script.sh 2. 创建 Property List (plist) 文件创建一个 Property List 文件,该文件描述了你的定时任务。你可以使用文本编辑器创建一个 plist 文件。例如:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.example.mytask</string> <key>ProgramArguments</key> <array> <string>/path/to/your/script.sh</string> </array> <key>RunAtLoad</key> <true/> <key>StartInterval</key> <integer>60</integer> </dict> </plist> 在上面的例子中,Label 是任务的唯一标识符,ProgramArguments 包含要执行的脚本的路径,RunAtLoad 表示在加载时运行,StartInterval 表示定时任务的间隔时间(以秒为单位,这里是60秒)。3. 保存 plist 文件:将 plist 文件保存到 ~/Library/LaunchAgents/ 目录中,命名为 com.example.mytask.plist(你可以自定义文件名,但确保文件名以 .plist 结尾)。4. 加载定时任务:执行以下命令加载定时任务。launchctl load ~/Library/LaunchAgents/com.example.mytask.plist 这将立即启动任务,并在以后的每个间隔时间运行它。5. 检查任务是否在运行你可以使用 launchctl list 命令检查任务是否在运行。launchctl list | grep com.example.mytask 如果看到输出,则任务正在运行。这是一个简单的例子,你可以根据需要调整 plist 文件中的参数,以适应你的实际需求。请注意,如果你修改了 plist 文件,你需要重新加载任务。请记得在使用 launchd 设置定时任务时,确保你的脚本和任务的配置是正确的,以避免不必要的问题。补充plist文件分布在:/System/Library/LaunchDaemons # 是用户未登陆前就启动的服务(守护进程) /System/Library/LaunchAgents # 由Mac OS X为用户定义的任务项 /Library/LaunchDaemons # 由管理员定义的守护进程任务项 /Library/LaunchAgents # 由管理员为用户定义的任务项 ~/Library/LaunchAgents # 由用户自己定义的任务项显示当前的启动脚本,status等于0就正常,等于正数,比如78,就是错误。launchctl list开机时自动启动 php-fpm, -w 是立即启动的意思sudo launchctl load -w /Library/LaunchAgents/org.php.php-fpm.plist停止正在运行的启动脚本sudo launchctl unload [path/to/script]再加上-w选项即可去除开机启动sudo launchctl unload -w [path/to/script]
2024年01月20日
7 阅读
0 评论
0 点赞
2024-01-18
debian10 安装 code-server
下载code-server安装包https://github.com/coder/code-server/releases下载地址:https://github.com/coder/code-server/releases/download/v4.20.0/code-server_4.20.0_amd64.debsudo dpkg -i code-server_4.4.0_amd64.deb# 安装 root@Debian10:/home/download# sudo dpkg -i code-server_4.20.0_amd64.deb Selecting previously unselected package code-server. (Reading database ... 67825 files and directories currently installed.) Preparing to unpack code-server_4.20.0_amd64.deb ... Unpacking code-server (4.20.0) ... Setting up code-server (4.20.0) ... # 运行一次生成配置文件 root@Debian10:/home/download# code-server [2024-01-18T06:53:04.033Z] info Wrote default config file to /root/.config/code-server/config.yaml [2024-01-18T06:53:04.761Z] info code-server 4.20.0 d0215eca8804d0be5d3551c39404e336032c3141 [2024-01-18T06:53:04.762Z] info Using user-data-dir /root/.local/share/code-server [2024-01-18T06:53:04.786Z] info Using config file /root/.config/code-server/config.yaml [2024-01-18T06:53:04.787Z] info HTTP server listening on http://127.0.0.1:8080/ [2024-01-18T06:53:04.787Z] info - Authentication is enabled [2024-01-18T06:53:04.787Z] info - Using password from /root/.config/code-server/config.yaml [2024-01-18T06:53:04.787Z] info - Not serving HTTPS [2024-01-18T06:53:04.787Z] info Session server listening on /root/.local/share/code-server/code-server-ipc.sock # 编辑配置文件,并打印 root@Debian10:/home/download# vim ~/.config/code-server/config.yaml root@Debian10:/home/download# cat ~/.config/code-server/config.yaml bind-addr: 0.0.0.0:80 auth: password password: jihuo cert: false # 运行 root@Debian10:/home/download# code-server [2024-01-18T06:54:27.555Z] info code-server 4.20.0 d0215eca8804d0be5d3551c39404e336032c3141 [2024-01-18T06:54:27.556Z] info Using user-data-dir /root/.local/share/code-server [2024-01-18T06:54:27.577Z] info Using config file /root/.config/code-server/config.yaml [2024-01-18T06:54:27.578Z] info HTTP server listening on http://0.0.0.0/ [2024-01-18T06:54:27.578Z] info - Authentication is enabled [2024-01-18T06:54:27.578Z] info - Using password from /root/.config/code-server/config.yaml [2024-01-18T06:54:27.578Z] info - Not serving HTTPS [2024-01-18T06:54:27.578Z] info Session server listening on /root/.local/share/code-server/code-server-ipc.sock [14:54:50] [14:54:50] Extension host agent started. [14:54:50] Started initializing default profile extensions in extensions installation folder. file:///root/.local/share/code-server/extensions [14:54:50] Completed initializing default profile extensions in extensions installation folder. file:///root/.local/share/code-server/extensions File not found: /usr/lib/code-server/lib/vscode/out/vsda_bg.wasm [14:54:57] [10.37.129.2][2b38f4c8][ManagementConnection] New connection established. File not found: /usr/lib/code-server/lib/vscode/out/vsda.js [2024-01-18T06:54:59.064Z] error Failed to get latest version {"error":"connect ENETUNREACH 20.205.243.168:443 - Local (0.0.0.0:0)"} [14:54:59] [10.37.129.2][2cd9b201][ExtensionHostConnection] New connection established. [14:54:59] [10.37.129.2][2cd9b201][ExtensionHostConnection] <2192> Launched Extension Host Process. 放入后台运行 #放入后台执行后,键盘输入ctrl + z 暂停任务 键盘按 ctrl + z 暂停 [1]+ Stopped # 此时输入jobs命令可以查看当前被暂停的任务 jobs [1]+ Stopped # bg将其放入后台,输入 bg %1,将进程号为1的进程恢复到后台运行 bg %1 [1]+ xxxx #查看任务已经在后台运行: jobs [1]+ Running xxxx # 使用disown -h 将这个作业忽略HUP信号: disown -h %1 //忽略这个作业的HUP信号 jobs [1]+ Running xxxxxx
2024年01月18日
11 阅读
0 评论
0 点赞
2024-01-18
debian 安装 parallels tools
# 卸载并重新进行挂载,如果不是cdrom,可以看一下是否是cdrom0 $ umount /media/cdrom $ mount -o exec /media/cdrom # 进入cdrom并安装 $ cd /media/cdrom $ ./install #卸载cdrom $ umount /media/cdrom
2024年01月18日
19 阅读
0 评论
0 点赞
2024-01-18
debian禁止桌面启动
禁止桌面环境,纯命令行启动前提:系统已经安装了桌面环境,需要禁止桌面环境,以纯命令行启动,节约性能修改默认的运行模式systemctl set-default multi-user.target查看当前系统运行模式systemctl get-default重启systemctl reboot启用桌面环境修改默认的运行模式systemctl set-default graphical.target重启systemctl reboot
2024年01月18日
11 阅读
0 评论
0 点赞
2024-01-17
Debian系统更换国内源
在Debian系统中更换为国内源,您可以按照以下步骤进行操作:#备份源列表文件:首先,打开终端并以管理员身份运行以下命令,备份当前的源列表文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak#编辑源列表文件:使用文本编辑器(如nano或vim)打开源列表文件: sudo nano /etc/apt/sources.list替换为国内源:将文件中的内容替换为适合您所在地区的国内源。以下是一些常用的国内源示例:阿里云源:deb http://mirrors.aliyun.com/debian/ buster main contrib non-free deb-src http://mirrors.aliyun.com/debian/ buster main contrib non-free deb http://mirrors.aliyun.com/debian-security/ buster/updates main contrib non-free deb-src http://mirrors.aliyun.com/debian-security/ buster/updates main contrib non-free deb http://mirrors.aliyun.com/debian/ buster-updates main contrib non-free deb-src http://mirrors.aliyun.com/debian/ buster-updates main contrib non-free deb http://mirrors.aliyun.com/debian/ buster-backports main contrib non-free deb-src http://mirrors.aliyun.com/debian/ buster-backports main contrib non-free 清华大学源:deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ buster/updates main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security/ buster/updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free保存并关闭文件。然后,运行以下命令更新软件包缓存:sudo apt updatesudo apt-get upgrade
2024年01月17日
8 阅读
0 评论
0 点赞
1
2