分类目录归档:技术笔记

INOTIFY – 监听事件

Linux 2.6.13 内核中引入了新的文件系统变化通知机制 inotify ,使用该特性提供的用户态调用 api ,可以方便的完成文件变化监听。

各种语言基本都提供了对该接口的调用方法: C 不必多说, Perl 使用 [Linux::Inotify2](https://metacpan.org/pod/Linux::Inotify2)Golang 使用 golang.org/x/sys/unixPython 则使用 [pyinotify](https://github.com/seb-m/pyinotify) 即可完成调用。

这里汇总所有相关监听事件,理论上针对所有语言通用:

 *            IN_ACCESS         文件被访问
 *            IN_ATTRIB         文件属性发生变化(文件元数据改变, 如权限, 链接计数, 扩展属性, 用户ID或组ID等)
 *            IN_CLOSE_WRITE      关闭以write方式打开的文件
 *            IN_CLOSE_NOWRITE  关闭以非write方式打开的文件
 *            IN_CREATE         在受监控目录内创建了文件/目录
 *            IN_DELETE         在受监控目录内删除了文件/目录
 *            IN_DELETE_SELF    被监测的文件/目录被删除
 *            IN_MODIFY         文件被修改
 *            IN_MOVE_SELF      移动受监测的文件或目录
 *            IN_MOVED_FROM     文件移出被监测的目录
 *            IN_MOVED_TO         文件移入被监测的目录
 *            IN_OPEN             文件被打开
 * --------- 上述flag的集合
 *            IN_ALL_EVENTS     以上所有flag的集合
 *            IN_MOVE             IN_MOVED_TO + IN_MOVED_FROM
 *            IN_CLOSE          IN_CLOSE_WRITE + IN_CLOSE_NOWRITE
 * --------- 不常用的flag
 *            IN_DONT_FOLLOW      不对符号链接解引用, 监控符号链接自身
 *            IN_MASK_ADD         将事件追加到pathname的当前监控掩码
 *            IN_ONESHOT          只监测一个事件, 事件发生后, 被监控项会从监控列表中消失
 *            IN_ONLYDIR          只监测目录
 *            IN_IGNORED          监控项被内核或应用程序移除
 *            IN_ISDIR          发生事件的是一个目录
 *            IN_Q_OVERFLOW     Event队列溢出
 *            IN_UNMOUNT          文件系统unmount

参考文献

Wiki.js 离线部署方法 | 离线拉取语言包

最近想在内网搭建一套 Wiki,在调研了各种 wiki 的搭建方式、功能之后,选择了 wiki.js。但是在部署过程中,发现其默认是通过公网拉取语言包等资源,内网安装需要一些特别的方法。

这篇文章就来介绍内网部署 wiki.js 并拉取语言包的方法。

安装方法

按照 官网安装方法,可以较快的将整个服务启动起来:

Step1 – 快速启动

# 安装前请确保安装了 node npm
$ apt-get install node npm
# 若内网服务器没有安装,可参考官网二进制离线安装的方法

# 首先获取离线包,可在互联网上下载,拷入内网服务器
$ wget https://github.com/Requarks/wiki/releases/download/2.5.272/wiki-js.tar.gz

# 之后将所有内容解压到一个安装路径,我装在 /opt/wiki 下
$ mkdir wiki
$ tar xzf wiki-js.tar.gz -C ./wiki
$ cd ./wiki

# 下面需要进行配置
$ mv config.sample.yml config.yml
# 按照自己的需求修改配置文件
$ vim config.yml 

# 如果使用 sqlite,在这里完成数据库初始化
$ npm rebuild sqlite3

# 服务启动
$ node server

Step2 – 配置 systemd

官网提供了 systemd 配置文件,直接创建,配置好之后即可使用

nano /etc/systemd/system/wiki.service

[Unit]
Description=Wiki.js
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/node server
Restart=always
# Consider creating a dedicated user for Wiki.js here:
User=nobody
Environment=NODE_ENV=production
WorkingDirectory=/var/wiki

[Install]
WantedBy=multi-user.target

最后:

$ systemctl daemon-reload
$ systemctl enable wiki
$ systemctl start wiki

# 检查一下是否启动
$ systemctl status wiki

# 查看日志
$ journalctl -xef -u wiki

Step3 – 离线安装语言包

内网环境无法直接下载语言包,此时需要按照如下步骤手动导入语言包:

  • 修改配置文件

首先需要告诉 wiki.js 当前运行在离线环境中,因此在配置文件中进行如下修改:

- offline: false
+ offline: true
  • 创建离线资源目录

之后在安装目录下创建一个文件夹 data/sideload 用来存放离线资源,比如我是安装在 /opt/wiki/ 下,配置文件中配置的数据文件夹为 /opt/wiki/data ,那么我就创建一个新的文件夹 /opt/wiki/data/sideload 即可。

  • 获取语言包

官方提供的语言包资源可以在这里下载:https://github.com/Requarks/wiki-localization

务必下载 locales.json ,之后下载您需要的语言包(如 zh.json )。

  • 安装

将下载好的 locales.json , zh.json , en.json 等资源拷入上面创建好的文件夹中。

最后重启服务即可:

systemctl restart wiki

参考文献

macOS 使用 remote-viewer 连接 spice 服务 | PC 连接 spice 云桌面方法

最近需要使用到云桌面办公,但目前仅支持 windows 客户端。后经过询问,发现是使用 spice 协议链接,提供地址后,即可使用第三方客户端链接。

MacOS 平台下没有很好的支持 spice 协议的图形化客户端,但是可以使用 remote-viewer 这个工具,也比较好用,下面介绍安装方法:

# jeffreywildman/homebrew-virt-manager 有些问题
# Krish-sysadmin 对它进行了修复,因此首先卸载参与包和地址
brew remove virt-manager
brew remove virt-viewer
brew untap jeffreywildman/homebrew-virt-manager

# 安装工具
brew tap Krish-sysadmin/homebrew-virt-manager
brew install virt-manager virt-viewer

# 如果缺少某些依赖库,安装后重试即可

# 使用
remote-viewer

https://imagehost-cdn.frytea.com/images/2022/01/25/2022-01-25-2.59.39816bc8ffe02fa999.png

输入 spice 地址链接即可。

https://imagehost-cdn.frytea.com/images/2022/01/25/2022-01-25-3.03.34fe54a45c4b94b76c.png

总结

这次探索走了不少弯路,从尝试各种第三方远程桌面客户端,到 remote-viewer 的安装,工具的安装也遇到不少问题,最后在我的 MacBook Air m1 上成功安装,在这里分享方法。

在 Linux 下可以使用 remmina 这款工具,支持 「X2Go  RDP  SPICE  VNC  SSH  HTTP/HTTPS」。

在 Windows 下则可以使用 virt-mananger 来链接,参考「windows和linux下的spice客户端使用方法」。

至此,Windows、Linux、MacOS 链接 spice 服务的方法介绍完毕。

参考文献

解决 SSH 无操作自动断开 | pychram 超时无响应

工作中常需要连接着服务器,下班或暂时离开时会出现一段时间不操作终端,此时就会自动断开。

这本身无伤大雅,重连即可,直到我发现,一些依赖 SSH 提供的服务也会因此受到影响,比如 Pychram 远程开发,会在一段时间后无响应,只能重启 Pychram 解决,很影响效率。

为解决该问题,在网上找到一种配置方法,亲测一夜 (10h+) 不会再断开,在此分享:

众所周知,SSH 是用于与远程服务器建立加密通信通道的,因此配置涉及服务端和客户端:

  • 服务端 /etc/ssh/sshd_config
-#ClientAliveInterval 0  #服务器向客户端发送请求消息的时间间隔,默认为0,不发送
-#ClientAliveCountMax 3  #服务器发出求后客户端没有响应的最大次数,超过后将自动断开。
+ClientAliveInterval 60  #每60秒发送一个KeepAlive请求
+ClientAliveCountMax 15  #总时间为:15*60 ,15分钟没有操作,终端断开。

# 以下任意命令重启 sshd 服务
service sshd reload
service sshd restart
systemctl sshd restart
  • 客户端 ~/.ssh/config
# 修改 ~/.ssh/config 对当前用户生效

# 这样配置通配所有服务端
Host *
  ServerAliveInterval 60

# 指定IP配置
Host *hostname.com    #指定IP
  ServerAliveInterval 60

# 或是全局配置(对所有用户生效)
vim /etc/ssh/sshd_config

+ ServerAliveInterval 60

参考文献

Python 传值 or 传引用

先说结论:python不允许程序员选择采用传值还是传引用。

  • 如果函数收到的是一个 可变对象 (比如 字典 或者 列表 )的引用,就能修改对象的原始值--相当于通过“传引用”来传递对象。
  • 如果函数收到的是一个 不可变对象 (比如 数字字符 或者 元组 )的引用,就不能直接修改原始对象--相当于通过“传值‘来传递对象。

在函数传值,或函数内部函数引用外部变量时,基本符合这个逻辑,比如:

def test_dect_out():
    lvs = {}
    num1 = 3

    def lan():
        lvs['sss'] = 4
        num1 = 5
        return lvs, num1

    print(lvs, num1)
    print(lan())
    print(lvs, num1)

{} 3
({'sss': 4}, 5)
{'sss': 4} 3

参考文献