写点什么

搭建本地 http 服务器 - 打开本地文件

作者:Lemoon Can
  • 2023-12-07
    浙江
  • 本文字数:2072 字

    阅读完需:约 7 分钟

搭建本地http服务器-打开本地文件

背景

笔者主要使用 notion 作为笔记记录的软件,但 notion 目前对脑图类笔记还没有较好的支持,且我习惯使用 xmind 画脑图,就希望可在 notion 笔记上关联相关脑图文件。

故想到是否可点击跳转链接来打开本地文件,网上一顿搜索,发现有人提供了现成工具:http 链接中嵌套相关软件的 URL Scheme 来实现。但这对于 xmind 也不适用,因 xmind 似乎未提供打开 xmind 文件的 URL Scheme 。

(也可能是我能力有限未找到,如果有人看到文章并知晓相关的 urlScheme,欢迎留言告知,不胜感激🤔)


于是我就继续想别的方式……联想到可执行 open 文件名 命令来用默认软件打开文件,那是不是可以自己手写个本地服务器:接收传递文件路径的 http 请求,在本地执行命令打开文件。

最后果然成功了👻

实现

功能

分析下功能需求,大致有两方面:

  1. 服务接收 http 请求:可执行打开本地文件的命令(成功后告知浏览器关闭当前页面)

  2. 服务在 mac 开机后可自启动

请求流程

请求的处理流程大致分为四个步骤:

  1. 点击链接跳转至浏览器

  2. 请求本地服务器,本地服务执行打开文件命令

  3. 服务器返回关闭当前页面的 html 文件

  4. 浏览器关闭页面


相关代码github地址 (代码实现挺简单的)

服务自启动

服务是部署在 tomcat 下的,故服务自启动的问题其实就转换成了开机自启动 tomcat 服务;而 tomcat 服务可通过命令行启动,故问题就转换成了如何在 mac 下开机后在后台运行自定义脚本。


最终找到的方式是:添加 mac 用户级后台任务来启动 tomcat。

具体如何做呢?

  1. 在 /Library/LaunchDaemons 目录下创建 x.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.lemoon.tomcat</string>  <!--启动时运行-->  <key>RunAtLoad</key>  <true/>	<!--运行命令 以下命令为:/tomcat路径/catalina run-->  <key>ProgramArguments</key>  <array>    <string>/tomcat路径/catalina</string>    <string>run</string>  </array>	<!--标准输出路径-->  <key>StandardOutPath</key>  <string>out-path/launchd-stdout.log</string>  <!--错误输出路径-->	<key>StandardErrorPath</key>  <string>error-path/launchd-stderr.log</string></dict></plist>
复制代码
  1. 执行命令:配置开机及当前启动后台任务执行文件中的命令

sudo launchctl load -w x.plist

x.plist 为第一步创建的文件

  1. 可在配置的输出路径查看执行情况

即第一步配置文件中的 StandardOutPath、StandardErrorPath


遇到的问题

  • 困扰的问题基本都在开机自启动服务。

  • 主要有:

    1. 开机自启动的某些方式启动的 tomcat 服务无法打开文件

    发现无法打开文件的方式应该都是用户未登录启动的后台任务执行启动 tomcat 服务,自然执行 open 命令可能会无响应(表现是:若 xmind 已打开了相应文件,该窗口会弹到首屏;若未打开相应文件,无任何反应,只能看到浏览器页面开了又关了)


    1. 通过登录项添加脚本执行开机自启动的方式启动的 tomcat 服务可打开文件,但会出现执行的窗口


    1. 开机自启动 tomcat 服务,若使用命令 catalina run,tomcat 服务可启动成功;若使用命令 catalina start, tomcat 服务无法正常启动

    大概率和 catalina run 是同步启动,catalina start 是异步启动有关,可能后台任务执行异步启动会有什么问题,具体未在做深究了


    Mac 开机自启动服务的方式

    鉴于以上问题,最终尝试了四种 mac 开机自启动的方式,总结如下(以开启启动 tomcat 服务举例):

    方式 1:用户级别后台任务

    配置用户级别的后台任务(与用户的登录会话相关联),执行命令启动相应服务

    使用步骤在上述最终采用的方式里已说明,参考 实现-服务自启动部分

    方式 2:系统级别后台任务

    配置系统级别的后台任务(与用户登录会话无关),执行命令启动相应服务


    使用步骤与方式 2 类似,区别:

    1. 在/Library/LaunchDaemons 目录下创建 plist 文件

    2. sudo launchctl load -w plist文件名 配置开机及当前系统后台程执行文件中的命令


    若要查看系统级别后台任务是否开启,可执行此命令:sudo launchctl list | grep plist文件名

    方式 3:登录项

    登录项添加脚本

    存在缺点:开机后第一次会询问是否执行脚本,若静默提醒后,后续会出现脚本的执行窗口


    使用步骤:

    1. 推荐在 /Library/StartupItems 目录下添加脚本 sudo vim xx.zsh

    #!/bin/zsh
    # 设置 Tomcat 的路径TOMCAT_HOME=/opt/homebrew/opt/tomcat
    # 切换到 Tomcat 的 bin 目录cd $TOMCAT_HOME/bin
    # 执行 Tomcat 启动命令catalina start
    复制代码


    1. 系统设置->通用->登录项 加 xx.zsh 脚本

    方式 4:登录项加 automator 流程

    登录项添加机器人脚本


    存在缺点:与 3 类似,开机后会打开 automator 软件

    且也部署的 tomcat 服务也未打开文件,虽然官方说 automator 流程是用户登录后执行的,不知是何原因


    使用步骤,与方式 3 类似,只是直接执行脚本变成了执行 automator :

    1. 打开 automator 软件,选取工作流程进入主界面

    2. 选左侧资源库中 实用工具->运行 shell 脚本,在出现的脚本编辑栏添加相应脚本,并保存

    3. 系统设置->通用->登录项 2 步骤保存的 automator 文件


    发布于: 刚刚阅读数: 5
    用户头像

    Lemoon Can

    关注

    装满月亮的柠檬罐子🌙🌟 2019-02-13 加入

    “快乐🤣”的 什么都不精😤的 程序媛👾

    评论

    发布
    暂无评论
    搭建本地http服务器-打开本地文件_notion链接脑图_Lemoon Can_InfoQ写作社区