起因
自己经常用Typora写东西做记录,有时候想在下班或周末接着写,但是Typora并没有远程同步的功能,所以想写个小工具帮自己做上传同步:服务开机自启动并拉取内容,监听工作库目录有变动则同步到远端。
如果想使用脚本或者快捷命令打开其他软件可以参考推荐一个工作区管理小工具中关于open 命令的描述。
Windows 设置开机自启
可以参考 Windows设置自己的程序开机自动启动
MacOS 设置服务开机自启动
方法1:设置登录项
进入系统偏好设置 -> 用户与群组(账户) -> 登录项
点击下方的+就可以添加登录项,会在开机后自动运行,设置了的开机自启项也会在这里管理。
要注意的是如果使用Node.js脚本作为启动项,需要删除文件后缀并添加可执行权限(否则开机后会使用编辑器打开,而不是执行脚本)。
方法2:扩展坞设置登录打开
扩展坞 -> 选项 -> 登录时打开,但是只能针对安装的应用程序。
方法3: Launchd配置
Launchd
是Mac
下用于初始化操作系统的关键进程。通过启动硬盘指定目录下的配置文件,来完成启动任务。
目录 | 描述 |
---|---|
~/Library/LaunchAgents | 当前用户登陆后启动的服务 |
/Library/LaunchAgents | 由管理员定义的用户登陆后启动的服务 |
/Library/LaunchDaemons | 由管理员定义的守护进程任务项 |
/System/Library/LaunchAgents | MacOS系统定义的用户任务项 |
/System/Library/LaunchDaemons | MacOS系统定义的守护进程任务项 |
plist 配置
比较有用的配置关键字:
标签 | 必填 | 说明 |
---|---|---|
Label | 是 | 标识符,用来表示该任务的唯一性 |
Program | 是 | 程序名称,用来说明运行哪个程序、脚本 |
ProgramArguments | 是 | 同上,与Program二选一或一起使用,只是可以运行多个程序、可带参数 |
WatchPaths | 否 | 监控路径,当路径文件有变化是运行程序,也是数组 |
RunAtLoad | 否 | 是否在加载的同时启动 |
StartCalendarInterval | 否 | 运行的时间,单个时间点使用dict,多个时间点使用 array -> dict |
StartInterval | 否 | 时间间隔,与StartCalendarInterval使用其一,单位为秒 |
StandardInPath、StandardOutPath、StandardErrorPath | 否 | 标准的输入输出错误文件,这里建议不要使用.log 作为后缀,会打不开里面的信息 |
PM2设置开机自启
pm2的startup 命令可以设置nodejs脚本开机自启动。pm2的对不同操作系统进行了不同处理:
其中对于MacOS的处理也是通过launchd来实现的,会在用户主目录下的Library/LaunchAgents/文件夹中新增一个plist文件:
<pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="js" cid="n79" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; caret-color: rgb(51, 51, 51); color: rgb(51, 51, 51); font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-indent: 0px; text-transform: none; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none; background-position: inherit inherit; background-repeat: inherit inherit;">switch(platform) {
...
case 'macos':
case 'darwin':
case 'launchd':
template = getTemplate('launchd');
destination = path.join(process.env.HOME, 'Library/LaunchAgents/' + launchd_service_name + '.plist');
commands = [
'launchctl load -w ' + destination
]
break;
default:
throw new Error('Unknown platform / init system name');
}</pre>
欢迎关注微信公众号"混沌前端"
参考: