主要功能:将多个并行shell任务转换为同步阻塞任务(我也不知道怎么描述比较合适)
少啰嗦,先看东西。
报告bug:
- email: [email protected]
- issue: github.com/LanFly/sync…
- 目前npm安装仅支持macOS和Linux。若要支持windows,需手动安装,这很简单。
下一个版本期望的新功能:
- 支持查看所有正在排队的任务
更新记录
v2.0.0:
- 可以给任务附加额外参数
v1.0.0:
- 配置任务方式变更,更简洁明了
- 可查看当前所有正在运行的任务
- 可查看当前所有已经配置的任务
- 增加日志,可查看所有用户操作的详细信息
v0.1.1:
- 新增node客户端,用户可在本地终端直接执行cmd,用法和服务端一样
v0.0.1:
- 支持配置任务
- 支持查看正在运行的相同的任务
举个栗子?:
我们前端使用gulp构建工具,有
程序媛A
和程序员B
开发同一个功能,现在需要部署到test1环境进行测试了。
程序媛A
执行下面的脚本:sh gulp-build-test1.sh
这个命令需要5分钟或者更多时间才能执行完。
程序员B
这时也想测试自己的程序有没有bug,他也执行下面的脚本:sh gulp-build-test1.sh
程序员B很慌?,因为脚本直接报一大堆他看不懂的错误。就算gulp不报错,他们也不应该同一时间编译同一个工程。
正确的顺序应该是: 程序猿A
在6分钟后执行完了,告诉程序员B
:“Hey, 我上完了”。 然后程序员B
再执行脚本。他们总共花了12分钟在等待脚本执行。 如果有3个以上的人呢?
很明显,程序猿A不需要等待她的脚本执行完成,她得知程序员B也要编译的时候,只要中断自己的任务,让程序员B再执行一次脚本就可以了。这样,他们总共只需要花6分钟时间。
这一切都需要A和B手工配合。syncShell就是这样一个工具,它能帮你自动管理多个用户的任务,然后按照先来后到的顺序自动执行。
怎么用?
第一步:把server
文件夹下的cmd.sh
文件放到你的服务器上,默认放到/usr/local/bin/cmd.sh
,然后设置alias
为cmd
,这样你就可以在任意目录执行cmd命令了。
alias cmd=/usr/local/bin/cmd.sh
复制代码
第二步:打开cmd.sh文件,配置要让它管理的任务。定位到这段代码:
配置日志文件的路径,如果你想使用默认路径,直接忽略它。接下来去配置任务。
# 配置操作记录日志文件
access_log="/var/log/cmd/access.log"
# |-----------------------------------------|
# | 在下面添加任务名称 |
# |-----------------------------------------|
# | example: cmdMap+=(["name"]="shell") |
# |-----------------------------------------|
cmdMap+=(["test1"]="sh ~/test.sh")
cmdMap+=(["test2"]="echo 'test2'")
# |-----------------------------------------|
复制代码
我们定义了2个任务,分别是test1
、test2
。任务名字由你自己指定,对应的脚本也由你指定,只要按照格式添加即可。但是也要符合bash的语法。
你可以在这里添加任意多个任务。
第三步:执行任务。 sh /usr/local/bin/cmd.sh -u LanFly -c test1
如果你配置了alias
,则可以使用更短的命令 cmd -u LanFly -c test1
-u
参数指定是谁在运行本次test1任务。-c
参数指定要运行的任务名。
cmd
就会立即执行你指定的test1的任务。如果你的test1任务还没执行完,B又执行了cmd -u someone -c test1
,则someone会得到下面这句话: I am busy now, LanFly is running at 2017-09-11 16:23:23
并且阻塞,直到LanFly的test1任务执行完。someone的test1任务会自动运行。LanFly也可以随时按下ctrl c
中断,someone的任务也会立即执行。
可以有多个用户执行同一个命令,cmd会按照先来后到顺序执行。只要前一个用户执行完,或者是被中断,后一个用户就会自动执行,依次执行完所有的用户。
支持多个用户执行多个不同的任务。cmd以任务名为管理单位。这意味着,你在执行test1的时候,其他用户可以执行test2,并且是不会阻塞。只有在同一个任务名有多个用户在执行的时候才会阻塞
。
查看当前所有正在运行的任务:
cmd who
# 或者
sh /usr/local/bin/cmd.sh who
复制代码
它会显示出当前所有正在运行的任务,你能看到是谁在什么时间运行了什么任务。
查看当前所有已经配置的任务:
cmd list
# 或者
sh /usr/local/bin/cmd.sh list
复制代码
如果你不知道当前配置了哪些任务,list会列出当前所有已经配置的任务。
查看所有用户操作的日志:
syncShell会记录所有通过cmd执行的命令。它会记录谁在什么时间执行了什么命令,并且在哪个时间完成了。 日志文件的路径由用户自己配置,如果你使用了默认配置,可以在/var/log/cmd/access.log
中查看。
安装服务端
服务端安装很简单,只需要一个cmd.sh文件就行。syncShell还有一个客户端,可以让你在自己电脑上远程执行cmd任务。省去手动连接服务器的麻烦。
cmd.sh文件在npm包里的server文件夹下。你也可以在服务器上面执行下面的命令下载cmd.sh文件。
wget https://raw.githubusercontent.com/LanFly/syncShell/master/server/cmd.sh
复制代码
安装客户端
很简单,使用-g选项全局安装。如果安装错误,你可能需要加上sudo
以提供权限。
sudo npm install syncshell -g
复制代码
安装完后,你就可以在本地terminal中像服务器端一样直接使用cmd命令了,用法稍微有点不同。不过在这之前我们先得进行简单的配置。
配置
在终端中输入:
sudo cmd
复制代码
第一次运行会让你输入服务端配置信息,按照自己的情况输入,下面是各字段的说明:
user
: 谁在用这个客户端,一般是你自己的用户名。即-c
参数的值,客户端会自动帮你填写-c
参数。
host
: 安装了cmd.sh文件的服务器地址。客户端会自动连接服务器帮你运行cmd命令。
username
: 用于登录服务器的用户名。
password
: 用于登录服务器的密码。默认空字符串。
cmdPath
: 服务器上cmd.sh
文件的路径。默认/usr/local/bin/cmd.sh
输入完后会保存这些信息到syncShell包的/client-Node/文件夹下的config.json文件中。配置完后就可以开始使用了。
如果没有自定义配置全局安装的路径,默认全局安装的包路径为/usr/local/lib/node_modules/syncshell/
运行
客户端用法和服务端用法一致,不同之处在于客户端会自动使用user字段的信息,帮你填写-u参数。所以你不必输入-u参数。
cmd -c test1
复制代码
如果你配置的用户名为LanFLy
,则上面的命令的结果等于sh /usr/local/bin/cmd.sh -u LanFly -c test1
。它会自动连接服务器,并运行这个命令。
你还可以输入其它的参数,它会原样传递给cmd.sh脚本,你可以编辑脚本实现更多功能。
客户端按ctrl+c同样会传递给服务端。总之,你可以认为客户端的执行和服务端完全一样。
给任务附加额外参数
2.0.0版本新增功能
现在,你可以在执行任务的时候给任务附加额外的参数。看下面的例子:
我配置了一个叫whoAmI
的任务
cmdMap+=(["whoAmI"]="sh ~/whoAmI.sh")
复制代码
whoAmI.sh脚本如下面所示
user="unknow" # 用户名
while getopts "u:" arg
do
case $arg in
u)
user=$OPTARG
;;
esac
done
echo 'my name is '$user
复制代码
这个脚本需要一个参数-u,并且会把-u参数的值输出。
现在我通过cmd执行这个任务:
cmd -c whoAmI -u LanFly
-c参数表示让cmd执行whoAmI任务,-u参数则会透传给whoAmI任务所对应的脚本。
你可以在后面无限附加任何参数,这些参数都会透传给任务。但要记住,前面2个参数必定是-c和-u,并且前面2个参数不会传给任务。-u参数在客户端自动帮你填写了,所以用客户端不需要-u参数。
任务执行的结果为:
my name is LanFly
现在让我们来看看cmd做了什么。
首先客户端cmd会生成要执行的命令:
sh ${cmd path in you server} -u ${your name} -c whoAmI -u LanFly
复制代码
然后发送这条命令到服务器执行。
服务端cmd收到这条命令后,查找whoAmI任务的内容。然后把前面2个参数去除,也就是-u和-c参数。然后把剩下的所有参数拼接在任务后面。
最终,服务器端cmd生成实际执行的bash命令:
sh ~/whoAmI.sh -u LanFly