taskctl命令行类(sh、exe、python新增scp)插件升级扩展
转载自: http://www.taskctl.com/forum/detail_129.html
上次写了一个帖子 TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)http://www.taskctl.com/forum/detail_122.html 。写完后发现,其实在原本的sh作业类型上改造一下就可以了,同时延伸到以前是用command执行方式的作业类型,都可以适当扩展,
命令行类插件升级20171110.rar就是 sh、exe、python的插件和新增拷贝一些小文件的scp作业类型。插件中主要使用的ssh免密及其相关的几个参数和bash的几种模式,这个只是一个基础版本,如果有特殊的需求基于上面的插件改造一下就可以了。下面是摘抄了原网页上写法写的一个sh脚本的扩展,其他几个类似。
使用TASKCTL调度服务时,如果需要跨用户或者跨服务器调度可以通过安装taskctl的代理来实现,但有时需要执行作业的服务器上仅仅只有几个脚本或者一两个可执行程序,此时再部署代理,就显得有点得不偿失了。我们知道TASKCTL支持任意作业类型的扩展,所以我们是不是可以考虑通过SSH远程连接来扩展这些插件,使其能执行这些远程少量的脚本程序。
下面是通过扩展TASKCTL用ssh连接来支持调度远程作业的步骤,一方面解决一些朋友迫切的调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。
下面编写的过程参照 http://www.taskctl.com/forum/detail_33.html 。
1、首先在服务端的$TASKCTLDIR/src/plugin/sh/shell/目录中新增cprunsh.sh作业插件,实际上就是一个shell程序,代码如下:
#!/bin/sh
#------------------------------------------------------------------------------
# 功能: [ssh方式]执行[远程]Shell脚本驱动插件程序
#
# 更新日志:20171030 由最开始的集成转换为插件,增强扩展原只能执行当前用户可读的 shell 脚本,
# 通过ssh协议,在免密的情况下可以执行本机不同用户和非本机的其他用户
#
# 参数:
# 1. progname 脚本的全路径名称
# 2. para 脚本的入口参数,格式为 para1 para2 ...
# 3. exppara 对应相应脚本的exppara属性,为脚本文件所在用户,当该参数为空时,默认为当前用户,如果不是当前用户时,为远程连接IP地址和用户名
# sip=172.22.1.1 ssh远程IP地址
# sport=9527 ssh远程连接端口
# suser=taskctl ssh远程用户
# 返回值: 脚本执行后的实际返回值
#
# 流程模式代码任务定义举例:
# 1、默认2个输入参数的安装用户可执行的服务器上的sh脚本(如果参数多个,以此类推)
# <sh>
# <name>job1</name>
# <progname>/home/taskctl/test.sh</progname>
# <para>para1 para2</para>
# </sh>
# 2、在同一台服务器上的其他用户可执行,当前节点安装用户不可执行sh脚本,当前用户和目标用户做了ssh免密(如果参数多个,以此类推)
# <sh>
# <name>job1</name>
# <progname>/home/username/test.sh</progname>
# <para>para1 para2</para>
# <exppara>[sport=22,]suser=taskctl</exppara>
# </sh>
# 3、不同服务器上,但都是shell作业,当前节点安装用户已经做了ssh免密(如果参数多个,以此类推)
# <sh>
# <name>job1</name>
# <progname>/home/username/test.sh</progname>
# <para>para1 para2</para>
# <exppara>sip=172.22.1.1,[sport=22,]suser=taskctl</exppara>
# </sh>
#
#------------------------------------------------------------------------------ if [ $# -ne 3 ]
then
echo "Param error !"
echo "Usage: $0 progname para expara"
exit 126
fi #------------------------------------------------------------------------------
# 第一步: 接收参数
#------------------------------------------------------------------------------
ProgName=$1
Para=$2
ExpPara=$3 #------------------------------------------------------------------------------
# 第二步: 解析 exppara
#------------------------------------------------------------------------------
function getValue(){
if [ $# -ne 2 ]
then
echo "......."
exit 1
fi str=`echo $2|awk -v record=$1 'BEGIN {
split(record,myarray,","); }
END{
for (i in myarray){
if (myarray[i]~$1){
if ( index(myarray[i],$1) == 1){
print myarray[i];
break;
}
}
}
}
'`
echo $str|awk -F"=" '{print $2}'
} ExpPara=`echo $ExpPara` #此处为了去前后空格,以便判断是否真正有入口参数
#通过判断 exppara 是否为空,决定是直接执行sh还是走ssh通道
#直接执行
if [ ! -n "$ExpPara" ]
then
sh $ProgName $Para
ret=$?
exit $ret
fi
#走ssh通道
sip=`getValue $ExpPara sip`
#通过判断 sip 是否为空,决定是直接执行本机其他用户还是远程服务器上的sh脚本
if [ ! -n "$sip" ]
then
sip=localhost
fi
#sport=`getValue $ExpPara sport` #默认没有修改端口 传参数的时候也没有传 先屏蔽
sport=22
suser=`getValue $ExpPara suser` #------------------------------------------------------------------------------
# 第三步: 检测是否配置了ssh免密连接
#------------------------------------------------------------------------------
ssh -o ConnectTimeout=5 -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/null
if [ $? != 0 ];then
echo -e "\nSSH Connection failed $sip"
echo -e "\nssh-keygen -t rsa -P ''"
echo -e "\nssh-copy-id -p $sport $suser@$sip"
exit 1
else
echo -e "\nSSH connection succeeded $sip"
fi #------------------------------------------------------------------------------
# 第四步: 运行JOB,并返回结果
#------------------------------------------------------------------------------
#echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip bash --login $ProgName $Para" #此处为打印执行命令行,以便调试判断是否真正有入口参数
ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "bash --login $ProgName $Para"
ret=$?
exit $ret
2、在桌面软件admin中进入"任务类型"功能中,设置ssh作业类型,如下图所示:

3、在桌面软件designer中设计 sh 作业如下代码片段:
<!-- 按插件的规则编写的流程设置 -->
<sh>
<name>MainModul_JobNode0</name>
<progname>/home/cdchen/successjob.sh</progname>
<para>para1 para2</para>
<exppara>sip=192.168.0.192,suser=cdchen</exppara>
<jobdesc>测试远程sh作业</jobdesc>
</sh>
4、调试测试作业是否符合预期

taskctl命令行类(sh、exe、python新增scp)插件升级扩展的更多相关文章
- 命令行工具aspnet_regiis.exe实现加密和解密web.config
命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...
- 如何在命令行模式下查看Python帮助文档---dir、help、__doc__
如何在命令行模式下查看Python帮助文档---dir.help.__doc__ 1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...
- 命令行工具osql.exe使用
目标: 快速在21个库修改Test表的某条记录,这几个库都分别在不同的服务器上. 通常会想到,到每个库都执行一下语句不就好了吗?这个数据库切换来切换去,挺麻烦了,通过命令行工具osql.exe就可以快 ...
- PHP命令行执行程序php.exe使用及常用参数
PHP命令行执行程序php.exe参数说明 -f <file>:以命令行方式运行指定的PHP文件,只要指定具体的PHP文件(带绝对路径),php.exe就可以执行PHP文件,所以这个参数单 ...
- MongoDB远程连接-命令行客户端mongo.exe
命令行客户端mongo.exe 位于安装目录bin子目录下.MongoDB的所有可执行程序都在其中. 双击打开mongo.exe应该是默认连接本地数据库服务,因此需要用Cmd或Powershell的方 ...
- 在命令行模式下查看Python帮助文档---dir、help、__doc__
在命令行模式下查看Python帮助文档---dir.help.__doc__ 1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...
- 让 windows 下的命令行程序 cmd.exe 用起来更顺手
在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...
- Windows命令行下pip安装python whl包
因为做网页爬虫,需要用到一个爬新闻的BeautifulSoup 的包,然后再关网上下的是whl包,第一次装,虽然花了点时间,最后还是装上去了,记录一下,方便下次. 先发一下官方文档地址.http:// ...
- 【Apache ZooKeeper】命令行zkCli.sh使用指南
ZooKeeper命令行 原文 http://blog.csdn.net/ganglia/article/details/11606807 ZooKeeper客户端 ...
随机推荐
- 1076. Forwards on Weibo (30)【树+搜索】——PAT (Advanced Level) Practise
题目信息 1076. Forwards on Weibo (30) 时间限制3000 ms 内存限制65536 kB 代码长度限制16000 B Weibo is known as the Chine ...
- 破碎纪念---记第二次Nexus4换屏
四太子的屏幕太易碎了.去年九月份在美国买的,十月便碎了,十二月修好,前几天又摔碎了. 本着对此机的喜爱,今天就进行了第二次换屏. 用同事的话说,如今已经是熟练工种了. 先来看看破碎景象: 右下角破碎, ...
- Cocos2dx--开发环境搭建
配置文档下载:http://pan.baidu.com/s/1rja8I 有些文件比較大的自己去下,这里列一下全部用到的文件 adt-bundle-windows-x86-20140321.zip a ...
- 进程间通信之-共享内存Shared Memory--linux内核剖析(十一)
共享内存 共享内存是进程间通信中最简单的方式之中的一个. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存同意两个或很多其他进程訪问同一块内存,就如同 malloc() 函数 ...
- POJ3254 状压dp
Corn ...
- hdu 5074 Hatsune Miku DP题目
题目传送门http://acm.hdu.edu.cn/showproblem.php?pid=5074 $dp[i][j] =$ 表示数列前$i$个数以$j$结尾的最大分数 $dp[i][j] = - ...
- python-----查看显卡gpu信息
需要安装pynvml库. 下载地址为:https://pypi.org/project/nvidia-ml-py/#history pip安装的命令为: pip install nvidia-ml-p ...
- linux下的C语言开发 GDB的例子
在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...
- 谈CSS布局中HTML标签语义化
很多人都在做前端,当然这里包括很多新手,也许在新手的想法就是在做布局的时候不要用font标签之类的就算是web标准了,这样一来,造成如今网上“div泛滥”,一看源文件,霍,除了div没其他标签了. 这 ...
- UVaLive 6834 Shopping (贪心)
题意:给定 n 个商店,然后有 m个限制,去 c 之前必须先去d,问你从0到n+1,最短路程是多少. 析:我们我们要到c,必须要先到d,那么举个例子,2 5, 3 7,如果我们先到5再到2,再到7再到 ...