如何用ps,bash编写远程脚本
本帖目的:讲解通用的远程脚本编写技术,不限于powershell,bash,perl,python。
问:本地脚本和远程脚本有何区别?如何编写远程脚本?
答:
1 模块化。要把远程任务,分成n个独立的单元。
我们编写的本地脚本,有时候没分的这么清楚。但远程脚本,就要分成n个脚本,或n个函数。
2 每个单元让它返回$true,或false。
我们要改造本地脚本,人为让每个单元能返回$true,或false。
好让我们远程判断每个单元是否执行成功。
3 单元中的每个关键命令,都让它形成闭环。
本地脚本中的本地命令,大都是不报错即成功。
对于bash这就尴尬了,癌症无解。powershell有try+catch解决这问题。
4 每个单元让它,在远程机子上,写入log。log中带上日期时间。
5 每个单元,甚至!每个命令,必须!设定超时时间。郭德纲说过,远程脚本,天生不老稳定的;)
本地脚本中的本地命令,大都不具备超时选项,远程运行时卡住就完了。
解决这个问题的最佳实践,是用多线程,和计时器。把单元放入后台线程,然后主线程sleep n秒。超时就kill掉。
这是笨办法,好在简单,bash也能实现。但bash没有线程,只有进程。
powershell中,无需使用此笨办法。powershell有计时器。计时器是多线程的。
new一个计时器对象,并绑定代码后,你就可以-开始计时器-停止计时器-调整计时周期。现在我们假定一个任务,前3次必然卡住超时,第4次必然成功。
那么我们只需在任务代码中,加上停止计时器的代码。并启动计时器即可。则前3次运行到卡住代码,超时后被计时器重启。最后1次通过了卡住代码,运行了计时器停止代码。这涉及到了两个线程之间传值,和控制。
而bash多进程,进程之间传值控制,不如线程之间方便。
所以说【多线程,计时器,是给命令加上超时选项的最佳实践】。
这里面还有一个细节。若你用ps的远程线程,来运行【代码单元】。可以起一个线程名,作为超时kill的标识符。
但是对于bash,就不能用进程名了。你需要一个标明进程是唯一的方法。
这种方法是有,但是又要加不少代码。在这里就不做展开详谈了。
python中也有计时器。perl我不知道,谁谈谈?
2018-10-01 帖子完毕,谢谢观看。
本帖目的:讲解通用的远程脚本编写技术,不限于powershell,bash,perl,python。
问:本地脚本和远程脚本有何区别?如何编写远程脚本?
答:
1 模块化。要把远程任务,分成n个独立的单元。
我们编写的本地脚本,有时候没分的这么清楚。但远程脚本,就要分成n个脚本,或n个函数。
2 每个单元让它返回$true,或false。
我们要改造本地脚本,人为让每个单元能返回$true,或false。
好让我们远程判断每个单元是否执行成功。
3 单元中的每个关键命令,都让它形成闭环。
本地脚本中的本地命令,大都是不报错即成功。
对于bash这就尴尬了,癌症无解。powershell有try+catch解决这问题。
4 每个单元让它,在远程机子上,写入log。log中带上日期时间。
5 每个单元,甚至!每个命令,必须!设定超时时间。郭德纲说过,远程脚本,天生不老稳定的;)
本地脚本中的本地命令,大都不具备超时选项,远程运行时卡住就完了。
解决这个问题的最佳实践,是用多线程,和计时器。把单元放入后台线程,然后主线程sleep n秒。超时就kill掉。
这是笨办法,好在简单,bash也能实现。但bash没有线程,只有进程。
powershell中,无需使用此笨办法。powershell有计时器。计时器是多线程的。
new一个计时器对象,并绑定代码后,你就可以-开始计时器-停止计时器-调整计时周期。现在我们假定一个任务,前3次必然卡住超时,第4次必然成功。
那么我们只需在任务代码中,加上停止计时器的代码。并启动计时器即可。则前3次运行到卡住代码,超时后被计时器重启。最后1次通过了卡住代码,运行了计时器停止代码。这涉及到了两个线程之间传值,和控制。
而bash多进程,进程之间传值控制,不如线程之间方便。
所以说【多线程,计时器,是给命令加上超时选项的最佳实践】。
这里面还有一个细节。若你用ps的远程线程,来运行【代码单元】。可以起一个线程名,作为超时kill的标识符。
但是对于bash,就不能用进程名了。你需要一个标明进程是唯一的方法。
这种方法是有,但是又要加不少代码。在这里就不做展开详谈了。
python中也有计时器。perl我不知道,谁谈谈?
2018-10-01 帖子完毕,谢谢观看。