每天学习一个命令:xargs

xargs 会从标准输入读取内容,然后将内容送给其他命令构建其他可执行命令。这意味着可以从一个命令行的输出结果读取内容并作为另一个命令的输入。

xargs 默认读取时按照空白字符分割的输入,输入可以带双引号,单引号,或者反斜杠转义,xargs 也可以读取新行,然后将输入作为参数执行对应的命令一次或者多次,默认是 /bin/echo。空白行输入会被忽略。

Unix 文件系统的文件可以包含空白和新行,这个默认的行为可能造成一些问题,包含空白的文件名可能被 xargs 错误读取。在这个情况下,最好是使用 -0 选项,在使用这个选项之前,同样要保证输出的结果同样是 null 字符分割的字符串,比如 GNU 下 find 命令的 -print0 选项。

如果任何调用产生 255 状态,xargs 会立即结束输入并给出错误。

使用

常用的选项

-o, --null  输入是 null 分割
-a file     从文件读取输入
-d delim    自定义分隔符
-E eof-str  自定义结束字符串
-I replace-str  使用自定占位符

-t          在命令执行之前打印
-p          交互模式,每一次执行命令会进行确认

查找并删除

find /tmp -name core -type f -print | xargs /bin/rm -f
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f    # name 可以包含空白
# or not use xargs
find /tmp -depth -name core type f -delete

删除目录下除了固定格式的其他文件

find . -type f -not -name '*.gz' -print0 | xargs -0 -I {} rm -v {}

说明:

  • -I {} xargs 的 -I {} 属性会将后面命令中的内容替换为 -I {} 指定的内容

从文件读取

比如文件 links.txt 中每一行都是一个链接,那么可以使用该命令将所有链接下载下来

xargs -a links.txt -I {} wget {}

找出目录下的 png 图片并打包到一个压缩包

首先找出目录下的 png 图片路径,然后打包到一个文件

find /path/to -name "*.png" -type f -print0 | xargs -0 tar czvf photos.tar.gz

解释:

  • -print0 的选项输出文件完整路径,然后紧跟一个空字符 (null), 而不是默认 -print 选项使用 newline ,该选项使得其他命令可以解析 find 命令的输出,比如 xargs-0 选项
  • 同上一条 -0 选项,表示的是输入的内容用 null 字符来分割,而不是使用空白字符,xargs 在使用该选项时会按照字面接受参数

将 ls 结果输出到一行

将 ls 结果输出到一行

ls -1 | xargs

说明:

  • ls -1 注意这里是 -1 是数字的 1,不是英文的 L,会一行输出一个文件

输出当前系统中的账号

cut -d: -f1 < /etc/passwd | sort | xargs

说明:

  • -d: 表示按照 : 分割
  • -f1 表示取第一个字段(第一列)

批量重命名

以前一直以为批量重命名得是一个非常高级的功能,在 GNU 下通过 xargs 和 rename 就可以快速实现

find -depth /path/to | xargs -n 1 rename -v 's/origin/after/' {} \;

该命令会把目录下所有文件统一成小写。

说明:

  • rename 使用 perl 的正则

reference


2019-06-19 linux , xargs

Useful tmux tips

Tmux 是一个很强大的终端复用工具,下面是日常积累中记录的一些使用经验。

Multiple Pane Synchronization

Tmux 一个非常著名的功能就是可以多个 Pane 同步输入,使用方式:

  • prefix
  • 输入 :setw synchronise-panes on
  • 然后在多个 Pane 中就开启了同步

同理配置 :set synchronise-panes off 就可以关闭

Zooming tmux

tmux 1.8 引入了 Zoom 功能,支持一键最大化当前 Working Pane,使用 prefix + z 来放大,再次按下恢复。

在 Tmux 和 Vim 之间无缝切换。

更多内容可以参考我的 配置

reference


2019-06-19 tmux , linux , commands , terminal

D-Bus

D-Bus 是 Desktop Bus 缩写,是一个 inter-process communication(IPC) 和 remote procedure call (RPC) 机制,用来允许在同一台机器上进行进程间通信。

D-Bus 作为 freedesktop.org 项目的一部分进行开发,由 Red Hat Havoc Pennington 起头,该标准被 Linux 上桌面平台 GNOME 和 KDE 采用。

D-Bus 将所有消息通过总线方式管理、分发,一般采用三层结构:

  • libdbus 库,允许应用间通信
  • 建立在 libdbus 上的消息守护进程,路由消息
  • 封装库,libdbus-glib 或者 libdbus-qt 封装使用细节

示例

D-Bus python 官方示例

Wiki

reference


2019-06-18 linux , dbus , gpg , desktop

Termux app 使用记录

Termux is an Android terminal emulator and Linux environment app that works directly with no rooting or setup required. A minimal base system is installed automatically - additional packages are available using the APT package manager.

官网地址:

和 Linux 类似,Termux 有着自己的软件源 http://termux.net/

使用

基本 UI 操作

  • 左侧滑出,侧边栏,管理 session
  • 长按终端,弹出上下文菜单

快捷键,音量减 (-) 代表 Ctrl

pkg 命令

pkg search <query>              搜索包
pkg install <package>           安装包
pkg uninstall <package>         卸载包
pkg reinstall <package>         重新安装包
pkg update                      更新源
pkg upgrade                     升级软件包
pkg list-all                    列出可供安装的所有包
pkg list-installed              列出已经安装的包
pkg shoe <package>              显示某个包的详细信息
pkg files <package>             显示某个包的相关文件夹路径

两个重要的文件路径

  • $HOME 进入终端的默认位置,一般在 /data/data/com.termux/files/home
  • $PREFIX 是 usr 目录,包含配置文件 etc/ 目录和可执行文件 bin/ 目录,一般为 /data/data/com.termux/files/urs

可以使用 echo $HOMEecho $PREFIX 来查看。

zsh

安装 zsh

pkg install wget curl git vim zsh unrar unzip
sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

SSH

默认 Termux 并没有安装 ssh 客户端

pkg install openssh

Penetration Test

日常 nmap

  • pkg install hydra Network logon cracker and bruteforcer supporting different services like ssh, telnet, ftp etc
  • pkg install nmap Utility for network discovery and security auditing
  • Metasploit Framework
  • RouterSploit
  • slowloris

更多可以参考 Termux Hacking

外延

reference


2019-06-15 termux , android , android-app , terminal , linux

全平台开源的密码管理软件 Bitwarden

今天逛博客偶然间见到了一款全平台开源的密码管理软件,回想 2013 年的时候曾经写过一篇密码管理的方案,一回首已经六年,而这六年间换了无数设备,换过无数密码,从最早手写,固定规则,到 KeePass,到 LastPass,还曾经买过一年的 LastPass 会员,如今稳定地用着 LastPass。也见证了 LastPass 从简陋的单纯的密码管理到 Chrome 上的自动填充,再到 Android 上的一键填充,最后 iOS 也开放了支持,所有的平台几乎 LastPass 通吃了, Auto Fill 的功能实在太贴心。然后为了增加安全性很多网站开始开启二步验证,最早只有孤零零的 Google 一家,而如今但凡安全措施做的比较好的网站都支持了二步验证,而二步验证非常不愉快的一个使用体验就是无法跨设备同步,Google Authenticator 但只是非联网的一个本地应用,当然站在 Google Authenticator 的角度无疑是对的,完全隔离网络,那么再厉害的黑客也无法获知二步验证的数字,然而这一点却牺牲了用户使用的便携程度。我曾经遇到过一次手机无法开机而丢失所有二步验证的 token,这几乎让我崩溃,我需要到每一个网站去重置我的二步验证设置。而 LastPass Authenticator 虽然牺牲了一定的安全性,但带来的易用性确实方便了。只要开启同步换一个设备登录 LastPass 那么所有的内容都回来了。所以 LastPass 和 LastPass Authenticator 也成为了我每个设备的必用软件。

然而时间到了 2019 年,网络安全问题和个人隐私的问题日渐严重,在这样一个时间节点,我发现了 Bitwarden 这样一款软件,更让我惊讶的是从服务端到客户端全开源,并且全平台支持,甚至还支持命令行登录,这一点连 LastPass 都不曾做过。但这个应用服务如今还依然不流行,大多数的潜在用户都被 1Password 或者 LastPass 这样的服务提供方吸收了。基于这样的理由,虽然目前可能自动填充的功能还不及 LastPass, 但 Bitwarden 还是非常值得一试。

-https://bitwarden.com/

简单的看了一下客户端基本用 C# 和 TypeScript 写成,暂时还无法看代码了。感兴趣可以自行到 GitHub 审查代码。

Bitwarden 解决了 LastPass 潜在的一些问题,但依然也引入了一些问题。LastPass 带来的问题一个就是安全问题,如何保证用户的密码在服务器同步时的安全性,虽然 LastPass 曾正面出来声明过所有的密码都是由客户端加密再进行传输,服务端是不进行解密的,但是这个不确定性就在于 LastPass 是否可信。另外一个问题就是 LastPass 集中了用户大量的密码,肯定是黑客等等专注需要攻破的系统,一旦发生 LastPass 主密码泄露事件,那么造成的影响就不是一家网站,而是附带的很多网站,那就是互联网的大事情了。而这一点也正是幸运的地方,那么 LastPass 肯定会雇佣一批安全专家对他们的系统进行维护,这远比维护一套自己的 Bitwarden 服务端的安全系数要高。

另外如果自行假设 Bitwarden 服务端,那么一定开启防火墙,保证只有自己才能访问。先写这么多之后再补充。


2019-06-15 bitwarden , password , password-manager , lastpass , 1password , chrome , cross-platform

Magisk 模块整理 For OnePlus 7 Pro

Magisk 通过修改启动(Boot)文件,在开机时加载 Magisk 框架,“不修改实际的系统文件”而“达到修改系统的效果”.

Magisk 在数据(非系统)分区里放置了一些修改好的系统文件 / 程序,系统启动时会加载这些修改过的文件 / 程序,而不是系统本身的文件,这样系统本身的文件并没有被实际修改,

Magisk 的另一大功能就是获取 Root 权限 / 授权(Root)管理(MagiskSU)了,在原本的 SuperSu 被国内厂家收购后就失去了大部分的支持,所以现在 ROOT 基本通过 Magisk 来实现了。

Magisk 的另一个用处是帮助系统通过各种检测系统安全 / 完整性的测试。部分应用游戏 和 Google 的 SafetyNet 检测(用于 Google Pay 等)会检测 Root 权限 / 系统文件是否被修改,Magisk 的 Magisk 隐藏(Magisk Hide)功能可以让它们无法检测到 Magisk 的存在,你便可以在正常使用这些应用 / 游戏 / 功能的同时享受 Magisk 带来的便捷。Magisk Hide 功能也能解决 Magisk 和一些软件的冲突。

和 Magisk 不同, Xposed 通过劫持系统文件,使得所有程序启动时都会被注入 Xposed 的进程,这样 Xposed 模块就可以通过这些进程对程序进行系统层面的几乎任何修改。Magisk 除了 Magisk Hide 功能,再无单个应用级别的操作,同时在开机后也几乎无法再对系统 / 应用进行修改,所以 Xposed 所能实现的绝大多数功能,Magisk 都无法完美实现。

所以这篇文章就暂时先列举一些好用的 Magisk 模块,Xposed 和 EdXposed 模块另外写总结。

Magisk Manager for Recovery Mode (mm)

这个 Module 可以让我们在 Recovery (比如 TWRP) 下修改 Magisk 的设置

使用方法:

  • 在终端中执行 sh /sdcard/mm
  • 或者在 Recovery 模式终端下执行 sh /sdcard/mm

Riru - Core

Riru 模块进入应用进程或系统服务进程并执行他们的代码

Riru - EdXposed

Android Pie 无法使用原版的 Xposed 所以有了 EdXposed 。

Busybox for Android NDK

BusyBox 是标准 Linux 工具的一个单个可执行实现,简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令。

Wifi Bonding (Qualcomm)

在高通设备上以 40MHz 的运行的 2.4GHz / 5.0GHz 的无线网络连接。在使用该 Module 之前需要了解什么是 Channel bonding,简单来说 Channel bonding 就是使用多于一条的通道来传输数据。

但说实话个人感觉提升并不明显。具体数据可以看下方。

Before oneplus 7 pro wifi bonding before

After oneplus 7 pro wifi bonding after

Riru - Location Report Enabler

一直都是使用 Market Unlocker 来虚拟运营商来开启 Google Location 的,但是每次 Market Unlocker 都需要手动启用一下,换成这个开机启动即可。

其他模块

Energized Protection

去广告模块,本人尝试后,误杀率挺大的,所以暂时先禁用。

Greenify4Magisk

似乎在 Pie 上系统自带的后台管理已经很强大,绿色守护也不怎么用了。

NFS-INJECTOR

内核优化,知识体系还没有深入到这里,暂时不安装。

App Systemizer

把系统应用转成系统应用,需要借助终端,下载 Termux 或者 Terminal Emulator

  • su 获取 root 权限
  • 输入 systemize 进入设置

编写 Magisk 模块

从模板克隆一份

各个目录解释:

  • META-INF: 刷机包签名 / 脚本文件,通常不动
  • common/post-fs-data.sh、common/service.sh:开机时执行的脚本文件,通常不动
  • common/system.prop: Build.prop 文件
  • system: 将需要替换的系统文件(空文件(夹)也可)按照位置放置即可
  • config.sh: 模块设置和安装 / 刷入时使用 ui_print 命令显示的提示信息
  • module.prop: 模块信息

然后将模块打包压缩成 zip 文件。

如果你使用 Telegram,这有一个频道可以关注一下,会发布 Magisk 模块。

  • https://t.me/magiskmod

2019-06-11 magisk , root , android , android-dev , adb , adaway , youtube , exposed

Android Kernel

说到 Android Kernel 那就不得不说到 Linux Kernel,Android Kernel 基于 Linux Kernel 的长期稳定版本

Linux Kernel

首先 Linux Kernel 是什么? Linux Kernel 是在 GNU GPL v2 开源许可下开源的硬件底层驱动,包括了 CPU 调度,存储管理,IO 管理,等等。Linux Kernel 是 GPL 开源,所以为了适用移动设备内存,CPU 频率,耗电等特点,Google 将这部分 Linux Kernel 做了修改,并按照 GPL 将修改开源了。

The kernel has complete control over the system.

Android 最早的内核是基于 Linux 2.6 内核的,在很长一段时间内,Android 的 Kernel 一直使用非常老版本的 Linux Kernel,但是随着时间发展,渐渐的每一个版本的 Android 发布都再使用最新的 Linux Kernel 1.

Android Kernel

回到 Android Kernel,不同设别出厂的时候就会带一个 stock 官方的 kernel,当然这个 Kernel 是稳定可以用于日常使用的。但是有些官方优化的 Kernel 并没有发挥硬件的最佳,所以 xda 上就有很多人发布不同的 Kernel,可以支持一些电池的优化,或者对硬件一些更好的支持。

ElementalX

ElementalX 内核是一个我从 Nexus 6, OnePlus 3 开始就使用过的 Kernel,由 flar2 开发。

ElementalX 内核的突出特点就是稳定,在不牺牲稳定性的前提下对系统做一些优化,比如滑动手势,亮度模式,震动模式,声音控制,文件系统格式等等。

个人使用的情况也是非常稳定,没有遇到过任何硬件不兼容问题。

Franco Kernel

Franco Kernel 由 franciscofranco 开发,是非常著名的一个 Kernel,支持非常多的设备。

blu_spark

blu_spark kernel 由 eng.stk 开发。

更多的 kernel 可以查阅这里

reference


2019-06-07 android , kernel , linux-kernel , aosp

OnePlus 7 pro Oxygen OS 设置

这些年用 Android 下来总是最喜欢原生的系统,但是却总觉得缺少一些什么,而这些东西在用 Oxygen OS(后简称 OOS)之后发现竟然如此的贴心好用,甚至有一定程度上要超越 Google 原生的系统。比如一些非常不错的小功能,状态来显示网速,三指截屏等。

OOS 自带

  • 内置录屏,虽然是一个使用频率不高的功能,但需要起来就能使用还是很不错的
  • 三指截屏,滚动获取长截图,以前多屏长截图需要额外的软件支持,自带还是很贴心的
  • 翻转静音
  • 可选虚拟按键,本人一直喜欢虚拟按键,但是用过 OOS 的 Navigation 手势之后发现原来真的可以不用常驻的虚拟键,虽然 OOS 的返回依然有些难用,但是也是一个不错的选择。

界面 Tweak

  • 电量显示百分比,默认情况下电量只会显示一个电池,并不会显示百分比,可以在设置中开启
  • 状态栏显示网络速度,设置开启

使用 GravatyBox 调整

  • Statue Bar 支持滑动调整亮度,OnePlus 7 Pro 的自动调亮似乎总是把屏幕亮度调低
  • 状态栏显示下载进度条
  • 显示上传下载网速,可选,和 OOS 原生类似

Android 9.0 uses xposed solutions

  • https://github.com/solohsu/EdXposed/releases
  • https://github.com/RikkaApps/Riru/releases
  • https://github.com/ElderDrivers/EdXp…nager/releases
  • https://github.com/solohsu/XposedInstaller/releases

Use Magisk order to install

  1. Flash magisk-riru-core-arm-arm64-v10.zip
  2. Flash magisk-EdXposed-arm-arm64-v x.x_beta-release.zip
  3. Installation XposedInstaller_by_dvdandroid_19_10_18. apk

Reboot the device

Android Pie 在 EdXposed 下可用的模块列表

reference


2019-06-03 oneplus7-pro , oxygen-os , rom , tweak

OnePlus 7 Pro 折腾记

OnePlus 7 Pro 折腾记。

Unlock Bootloader

先前准备:

  • 备份数据,具体可以使用 adb 命令,见后文
  • 开启开发者模式,Settings -> About Phone -> 点击 Build Number 7 次
  • 调试模式,Settings -> Developer option -> Enable USB Debugging
  • 开启 OEM Unlocking,Settings -> Developer options -> OEM Unlocking 开启
  • PC 上安装 fastboot 工具

具体步骤

  • 数据线连接手机,adb devices 确认连接成功
  • 手机出现 Debug 对话框,确认
  • 进入 bootloader 模式,adb reboot bootloader
  • fastboot devices
  • fastboot oem unlock
  • 然后使用音量键选择,重启
  • 等待重启完毕就 OK 了

TWRP

第三方的 Recovery,首推 TWRP, 在 OnePlus 7 Pro 推出不久之后 xda 上面的 mauronofrio 就发布了非官方版本的 TWRP,当然随着时间往后 mauronofrio 将其制作的 TWRP 发布到了官方页面 . 本人测试 2019-06-08 的 twrp-3.3.1-3-guacamole.img ,非常完美。

安装 TWRP 过程

  • 去官方网站下载 twrp-3.3.1-3-guacamole.img 和 twrp-installer-3.3.1-3-guacamole.zip 文件准备,img 文件放到桌面版以便于 adb 刷入,zip 包拷贝到手机内存
  • 连接电脑,让手机进入 fastboot 模式
  • fastboot boot twrp-3.3.1-3-guacamole.img 让手机用该 Recovery 启动,boot 命令只会让手机此次启动使用 TWRP,需要进行下一步才能让手机保持 TWRP Recovery
  • 在 TWRP 中 flash 之前准备好的 zip 包

刷完重启进入系统

注意:OnePlus 7 Pro 使用 Slot A/B,但是最新的 TWRP 已经自动支持 A/B 识别,不用担心 A/B 的问题

Root OnePlus 7 Pro with patched Boot Image

在 root 之前需要注意

  • 使用原生 OOS
  • Unlocked bootloader
  • fastboot 工具

然后根据一下流程:

  • 根据自己的版本 GM1910,系统版本 Oxygen OS 9.5.6 下载 patched boot image,或者自己制作 patched boot image
  • 安装最新的 Magisk Manager
  • adb reboot bootloader 进入 fastboot mode
  • fastboot devices
  • 如果担心下错 boot image,可以尝试使用 fastboot boot boot.img 来用本地的 image 文件启动
  • 确认没有问题之后,刷入 fastboot flash boot boot_patched.img
  • fastboot reboot 重启
  • 打开 Magisk ,安装,使用 Direct Install
  • 这样就有了一个 root 的 OnePlus 7 Pro

From: xda

Magisk

使用 Magisk ROOT

From: xda

更新系统 OTA 之后保留 recovery root 等

更新 OTA, Magisk 在拥有 slot A/B 的设备上有新的特性,能让系统正常更新而不会丢失 ROOT。如果想要了解更多 A/B 分区的问题可以参考这里.

如果想要在 OTA 之后保留 ROOT:

  • 使用全量包更新,然后在 System , System, 设置中使用本地更新,切记更新完成不要立即重启
  • 打开 Magisk ,点击 Magisk 一行的安装,在弹出的对话框中点击安装
  • 然后在弹出的对话框 (select Method) 中选择 Install to Inactive Slot (After OTA) 选项 (中文应该是,安装到未使用的槽位,安装完 OTA 后)
  • 最后安装重启

在上方的步骤重启进入系统之后会丢掉 TWRP,进入系统后需要重新刷入,在 OTA 之后保留 TWRP:

  • 打开 Magisk Manager ,然后像刷入其他 Module 一样输入之前 TWRP 的 zip 包
  • 不要重启,刷入 TWRP 之后会丢失 ROOT Access
  • 然后重新到 Magisk,点击 Install , Direct Install,然后再重启

在最后一步,有些教程可能有问题,在这里只需要 Direct Install,而不需要 Install to Inactive Slot(After OTA) 了。

这些步骤之后就 OTA 成功,并且保留了 TWRP,以及 Magisk 和 Magisk 下所有的模块。

使用 adb 备份数据

使用 adb 备份数据的时候千万注意,adb 备份的数据恢复时不会自动安装应用,并且可能恢复不完整。如果可能还是使用 Titanium Backup (ROOT) 等专业工具备份和恢复。

adb backup -apk -shared -all -f op7pro-backup-file.ad

参数解释:

  • -apk|-noapk 是否备份包含 apk 或者仅仅备份应用数据,推荐使用 -apk 选项,默认为 -noapk
  • -shared|-noshared 决定是否备份设备共享的 SD 卡内容,默认为 -noshared,主要包括内部存储中的音乐,图片和视频等,推荐使用 -shared
  • -all 备份所有应用
  • -system|-nosystem 决定 -all 选项是否包含系统应用,默认是 -system
  • -f 后面需要指定路径及文件名,表示用来存储的位置,比如 -f /path/backup.file 那么会存储在 path 目录下名为 backup.file 的文件中

恢复数据

设备连接电脑,adb devices 查看连接成功

adb restore op7pro-backup-file.ad

如果想要手动解开这个备份文件,可以参考这个项目

一些问题

GM 版本问题

氧系统有好几个版本的全量 ROM, GM21AA,GM21BA。这两个版本的含义是:

  • 标记有 GM21AA 的包适用于印度、全球(不含欧洲)、美国的无锁版 Model

      - GM1911: India
      - GM1917: Global/US Unlocked (?)
    
  • GM21BA 欧洲销售版本

      - GM1913: EU
    
  • GM27BA EU 5G 版本,GM 1915
  • GM31CB GM1915 T-Mobile (Carrier Locked)

adb 连接问题

adb 之前保证打开开发者模式,并且设置中确保设置打开,

adb devices
List of devices attached
5fxxxxxx	no permissions (verify udev rules); see [http://developer.android.com/tools/device.html]

在使用 adb 连接的时候如果遇到这个问题,那么在通知栏中,换一种 USB 连接模式,保证非充电模式。如果还不行可以尝试

adb kill-server
adb start-server

更多关于 adb 和 fastboot 命令的使用可以参考之前的 adb 文章fastboot 文章

reference


2019-06-02 oneplus , android , root , magisk , adb

Java 定时任务框架 Job-scheduling Quartz 使用

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system.

Setup

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

Usage

客户端调用

JobDetail job = newJob(MyJob.class)
    .withIdentity("myJob")
    .build();

Trigger trigger = newTrigger()
    .withIdentity(triggerKey("myTrigger", "myTriggerGroup"))
    .withSchedule(simpleSchedule()
        .withIntervalInHours(1)
        .repeatForever())
    .startAt(futureDate(10, MINUTES))
    .build();

scheduler.scheduleJob(job, trigger);

Source Code

StdSchedulerFactory 是 Scheduler 的工厂方法,实现了 SchedulerFactory 接口。

// 提供客户端可用的 Scheduler
Scheduler getScheduler() throws SchedulerException;
// 通过名字获取
Scheduler getScheduler() throws SchedulerException;
// 返回当前 JVM 中通过该 Factory 创建的所有 Scheduler
Collection<Scheduler> getAllSchedulers() throws SchedulerException;

SchedulerRepository 单例,内部持有一个 Map HashMap<String, Scheduler> schedulers

类中,绑定 (bind),解绑 (remove) 都为同步方法,保证线程安全。

Scheduler

Scheduler 是一个很庞大的接口,它的实现主要有

  • RemoteScheduler, via RMI
  • StdScheduler, std
  • JBoss4RMIRemoteMBeanScheduler, via JBoss’s JMX RMIAdaptor

Quartz 的核心实现也基本都在这些实现类中,Scheduler 可以用来定时触发任务。

CronScheduleBuilder

CronScheduleBuilder 用来将字符串的 cron 表达式变成 CronScheduleBuilder 对象,ScheduleBuilder 是一个抽象类

public class CronScheduleBuilder extends ScheduleBuilder<CronTrigger> {
    public static CronScheduleBuilder cronSchedule(String cronExpression) { }
}

主要的实现有:

  • CronScheduleBuilder 主要实现 cron 定时任务,通过字符表达式
  • SimpleScheduleBuilder 比较简单的 ScheduleBuilder
  • CalendarIntervalScheduleBuilder 看例子 withIntervalInDays(3) 每隔 3 天,如果要使用固定间隔的可以看一下这个
  • DailyTimeIntervalScheduleBuilder 看例子比较简单 onDaysOfTheWeek(MONDAY, THURSDAY) , 每一个周一和周四

比如

CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpr());
trigger = TriggerBuilder.newTrigger().withIdentity(triggerId).withSchedule(scheduleBuilder)
    .forJob(jobDetail).build();
scheduler.scheduleJob(jobDetail, trigger);

2019-05-30 java , quartz , schedule , cronjob

电子书

最近文章

  • 每天学习一个命令:xargs xargs 会从标准输入读取内容,然后将内容送给其他命令构建其他可执行命令。这意味着可以从一个命令行的输出结果读取内容并作为另一个命令的输入。
  • Useful tmux tips Tmux 是一个很强大的终端复用工具,下面是日常积累中记录的一些使用经验。
  • D-Bus D-Bus 是 Desktop Bus 缩写,是一个 inter-process communication(IPC) 和 remote procedure call (RPC) 机制,用来允许在同一台机器上进行进程间通信。
  • Termux app 使用记录 Termux is an Android terminal emulator and Linux environment app that works directly with no rooting or setup required. A minimal base system is installed automatically - additional packages are available using the APT package manager.
  • 全平台开源的密码管理软件 Bitwarden 今天逛博客偶然间见到了一款全平台开源的密码管理软件,回想 2013 年的时候曾经写过一篇密码管理的方案,一回首已经六年,而这六年间换了无数设备,换过无数密码,从最早手写,固定规则,到 KeePass,到 LastPass,还曾经买过一年的 LastPass 会员,如今稳定地用着 LastPass。也见证了 LastPass 从简陋的单纯的密码管理到 Chrome 上的自动填充,再到 Android 上的一键填充,最后 iOS 也开放了支持,所有的平台几乎 LastPass 通吃了, Auto Fill 的功能实在太贴心。然后为了增加安全性很多网站开始开启二步验证,最早只有孤零零的 Google 一家,而如今但凡安全措施做的比较好的网站都支持了二步验证,而二步验证非常不愉快的一个使用体验就是无法跨设备同步,Google Authenticator 但只是非联网的一个本地应用,当然站在 Google Authenticator 的角度无疑是对的,完全隔离网络,那么再厉害的黑客也无法获知二步验证的数字,然而这一点却牺牲了用户使用的便携程度。我曾经遇到过一次手机无法开机而丢失所有二步验证的 token,这几乎让我崩溃,我需要到每一个网站去重置我的二步验证设置。而 LastPass Authenticator 虽然牺牲了一定的安全性,但带来的易用性确实方便了。只要开启同步换一个设备登录 LastPass 那么所有的内容都回来了。所以 LastPass 和 LastPass Authenticator 也成为了我每个设备的必用软件。