windows延迟启动程序批处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows延迟启动程序批处理相关的知识,希望对你有一定的参考价值。
BAT 实现延时不好 建议用VBS比如
这个为开机延迟拨号上网的命令,适合开机比较卡的用户.比如装了卡巴斯基的.
set hipon=CreateObject("Wscript.Shell")
Wscript.sleep 7500
hipon.run "rasdial adsl 上网账号 上网密码"
前提你的宽带连接名字为 adsl
7500为毫秒(7.5秒) 可以自己定义
建立文本文档 输入以上内容 保存为autoadsl.vbs 存在 开始 程序 启动里面
hipon.run "程序地址 程序名称 参数"
其他
1、利用“死”循环:设定一个时间差,如果当前时间与设定时间之差不大于设定之时间差,则不退出该循环,从而达到延时的目的
@echo off
set /a Start=%time:~6,2%
:ProDelay
set /a Now=%time:~6,2%
set /a Diff=%Now%-%Start%
rem 以下这一句可以防止秒数从59跳到1时产生的错误。
if %Diff% lss 0 set /a Diff=%Diff%+60
if %Diff% leq 2 goto :ProDelay
echo ok!
2、利用ping命令实现延时,方法巧妙而且可以控制,但精度不高。
如:ping -n 3 127.0.0.1>nul大约可以停顿2秒
-n后的数字是发送包的数目,为暂停秒数加一。此法每秒有0.5%的偏差,时间精度为1秒。 参考技术A 这篇文章主要介绍了Windows命令行bat批处理延迟sleep方法,需要的朋友可以参考下
Windows下批处理文件没有像Linux一样的Sleep函数进行延时处理,这里有2种较为实用的方法实现延迟:
1、使用WScirpt的sleep功能,精度0.001秒
创建vbs延迟文件,然后在批处理文件中调用,使用WScript的 sleep函数,实现sleep的效果。
实战:
1)创建文件sleep.vbs:
echo WScript.sleep 5000 > sleep.vbs
sleep.vbs 内容如下:
WScript.sleep 5000。
2)在批处理文件中调用,创建示例文件test.bat,内容如下:
复制代码 代码如下:
sc stop OracleOraDb10g_home1TNSListener
Wscript sleep.vbs
sc start OracleOraDb10g_home1TNSListener
2、使用ping 的定时功能,精度1秒
实战:创建示例文件test2.bat,内容如下:
复制代码 代码如下:
sc stop OracleOraDb10g_home1TNSListener
ping -n 3 127.0.0.1>nul
sc start OracleOraDb10g_home1TNSListener
说明:3为ping包发送次数,可作为延迟秒数进行使用,需要延迟几秒就设置几。
>nul避免屏幕输出,将输出输入到空设备,因为不需要结果,仅用到其定时功能。
以下是其他网友的补充:
好好的批处理,居然没有正式的Sleep可供调用。有时候,确实感到很无趣。
1. 方法1:
ping 1.1.1.1来模拟
好不容易从stackoverflow上找到一个答案(称之为答案,是因为它被人标注为answer),是这么实现的:
ping 1.1.1.1 -n 1 -w 60000 > nul
这个表示,会sleep 60秒钟。
果真如此吗? 它要基于一个假设:1.1.1.1永远不会被目标机器ping通。但我却碰到了灵异事件,在某台测试机上,直接能ping通:
Pinging 1.1.1.1 with 32 bytes of data:
Reply from 1.1.1.1: bytes=32 time<1ms TTL=60
Reply from 1.1.1.1: bytes=32 time<1ms TTL=60
Reply from 1.1.1.1: bytes=32 time=6ms TTL=60
Reply from 1.1.1.1: bytes=32 time<1ms TTL=60
Ping statistics for 1.1.1.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 6ms, Average = 1ms
所以,这个方法是靠不住的。
2. 依然使用ping来模拟,
请看下边的bat:
这个就表示要sleep大概60秒钟。
当然,你也可以把wait_ext1那部分重命名一个单独的批处理进行调用。
3. 似乎2003还有一个resource kit包下载,里边就有sleep.exe
有时候真的是痛恨Windows下的批处理.
3、还有两种方法实现Sleep功能
一种是通过连续读取系统时间,进行比较,达到一定值时退出实现睡眠功能,但该操作应耗用CPU较大,不推荐。
另一种是德国一位哥们的做法,直接用debug方法生成一个定时器程序,该方法可能破坏系统的稳定性,或容易植入病毒(使用他人代码),亦不推荐使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
echo q | debug>nul
echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sleep.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>sleep.com
echo Tz~~@GwkBG@OEKcUt`~@MqqBsy?seHB~_Phxr?@zAB`LrPEyoDt@Cj?>>sleep.com
echo pky_jN@QEKpEt@ij?jySjN@REKpEt@jj?jyGjN@SEKkjtlGuNw?p@pjirz>>sleep.com
echo LFvAURQ?OYLTQ@@?~QCoOL~RDU@?aU?@QOq?@IKuNWpe~FpeQFwH?Vkk>>sleep.com
echo _GSqoCvHOjeOSeIQRmA@KnEFB?p??mcjNne~B?M??QhetLBgBPHexh@e=>>sleep.com
echo EsOgwTLbLK?sFU`?LDOD@@K@xO?SUudA?_FKJ@N?KD@?UA??OHCQOQ??R>>sleep.com
echo _OQOL?CLA?CEU?_FU?UAQ?UBD?LOC?ORO?UOL?UOD?OOI?UgL?LOR@YUO?>>sleep.com
echo dsmSQswDOR[BQAQ?LUA?_L_oUNUScLOOuLOODUO?UOE@OwH?UOQ?DJTSDM>>sleep.com
echo QTqrK@kcmSULkPcLOOuLOOFUO?hwDTqOsTdbnTQrrDsdFTlnBTm`lThKcT>>sleep.com
echo @dmTkRQSoddTT~?K?OCOQp?o??Gds?wOw?PGAtaCHQvNntQv_w?A?it\EH>>sleep.com
echo zpQpKGk?Jbs?FqokOHT?jPvP@IQBDFAN?OHROL?Kj??pd~aN?OHROd?G>>sleep.com
echo Q??PGT~B??OC~?ipO?T?~U?p~cUo0x>>sleep.com
sleep.com>sleep.exe
del sleep.com
以上代码要使用批处理方式.使用 sleep.exe 10000 时间单位是毫秒
4、从脚本之家下载sleep.exe文件
https://www.jb51.net/softs/2466.html
您可能感兴趣的文章:
Windows批量搜索并复制/剪切文件的批处理程序实例
windows搜索空文件夹的批处理程序代码实例
Windows下使用批处理文件.bat删除旧文件
Windows 2008 r2任务计划程序执行批处理失败问题解决方法
Windows下bat批处理脚本使用telnet批量检测远程端口小记
php启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
Windows运行bat批处理文件时隐藏cmd命令提示符窗口的方法
windows批处理命令教程
Windows下用命令行修改IP地址的方法详解(附批处理文件)
windows批量检测文件(夹)是否存在的批处理程序
启动或确保延迟作业在应用程序/服务器重新启动时运行
【中文标题】启动或确保延迟作业在应用程序/服务器重新启动时运行【英文标题】:Start or ensure that Delayed Job runs when an application/server restarts 【发布时间】:2011-02-04 13:40:50 【问题描述】:我们必须使用delayed_job(或其他一些后台作业处理器)在后台运行作业,但我们不能更改服务器上的启动脚本/启动级别。这意味着如果提供程序重新启动服务器,则不能保证守护程序保持可用(因为守护程序将由每个部署仅运行一次的 capistrano 配方启动)。
目前,我能想到的确保delayed_job 守护程序始终运行的最佳方法是向我们的Rails 应用程序添加一个初始化程序,以检查该守护程序是否正在运行。如果它没有运行,则初始化程序启动守护程序,否则,它就让它继续运行。
因此,问题是我们如何检测到 Delayed_Job 守护程序正在从脚本内部运行? (我们应该能够相当容易地启动一个守护进程,有点我不知道如何检测一个是否已经处于活动状态)。
有人有什么想法吗?
问候, 伯尼
根据下面的答案,这就是我想出的。只需将其放入 config/initializers 中即可:
#config/initializers/delayed_job.rb
DELAYED_JOB_PID_PATH = "#Rails.root/tmp/pids/delayed_job.pid"
def start_delayed_job
Thread.new do
`ruby script/delayed_job start`
end
end
def process_is_dead?
begin
pid = File.read(DELAYED_JOB_PID_PATH).strip
Process.kill(0, pid.to_i)
false
rescue
true
end
end
if !File.exist?(DELAYED_JOB_PID_PATH) && process_is_dead?
start_delayed_job
end
【问题讨论】:
在你的回答中,我们不应该也提供-e production
吗?
使用 rails3 这个解决方案对我不起作用。开始这个过程完全错误:它继续开始额外的工作。我回到 capistrano 任务:)
对于 Rails 4+,您应该在 start_delayed_job
方法中将 script/delayed_job
替换为 bin/delayed_job
【参考方案1】:
检查是否存在守护进程 PID 文件 (File.exist? ...
)。如果它在那里,则假设它正在运行,否则启动它。
【讨论】:
太棒了!听起来很容易!你会碰巧在哪里可以找到那个文件吗? 您将在应用程序的 tmp/pids 文件夹中找到该文件。您可能还想检查是否存在具有文件 ID 的进程。 PID 文件在崩溃后可能仍然存在。 太棒了!谢谢!我现在会投票,并等待一两天内是否还有其他选择。 您必须查找 PID 文件 并且 如果进程表中存在具有该 ID 的条目,AND 可能还会检查以查看它有正确的名称。如果系统意外关闭并留下陈旧的 PID 文件,则前两个测试很可能是正确的,而该 ID 处的进程不是预期的进程。也许更快的测试方法是让守护进程响应某种心跳请求。发送请求,如果您得到正确的响应,您就知道您需要的代码正在运行。在这种情况下,实际上不需要 PID 文件测试。【参考方案2】:更多清理思路:不需要“开始”。您应该挽救“没有这样的进程”,以免在其他问题出现时触发新进程。救援“没有这样的文件或目录”以及简化条件。
DELAYED_JOB_PID_PATH = "#Rails.root/tmp/pids/delayed_job.pid"
def start_delayed_job
Thread.new do
`ruby script/delayed_job start`
end
end
def daemon_is_running?
pid = File.read(DELAYED_JOB_PID_PATH).strip
Process.kill(0, pid.to_i)
true
rescue Errno::ENOENT, Errno::ESRCH # file or process not found
false
end
start_delayed_job unless daemon_is_running?
请记住,如果您启动多个工人,则此代码将不起作用。并查看 script/delayed_job 的“-m”参数,它与守护进程一起生成一个监控进程。
【讨论】:
【参考方案3】:感谢您在问题中提供的解决方案(以及启发它的答案:-)),它对我有用,即使有多个工人(Rails 3.2.9、Ruby 1.9.3p327)。
让我担心的是,例如,在对 lib 进行一些更改后,我可能会忘记重新启动 delay_job,导致我在意识到这一点之前调试了几个小时。
我将以下内容添加到我的script/rails
文件中,以允许问题中提供的代码在我们每次启动 rails 时执行,而不是每次工作人员启动时执行:
puts "cleaning up delayed job pid..."
dj_pid_path = File.expand_path('../../tmp/pids/delayed_job.pid', __FILE__)
begin
File.delete(dj_pid_path)
rescue Errno::ENOENT # file does not exist
end
puts "delayed_job ready."
我面临的一个小缺点是它也被rails generate
调用。我没有花太多时间为此寻找解决方案,但欢迎提出建议:-)
请注意,如果您使用的是 unicorn,则可能需要在 before_fork
调用之前将相同的代码添加到 config/unicorn.rb
。
-- 已编辑: 在对上述解决方案进行了更多尝试之后,我最终做了以下事情:
我创建了一个文件script/start_delayed_job.rb
,内容如下:
puts "cleaning up delayed job pid..."
dj_pid_path = File.expand_path('../../tmp/pids/delayed_job.pid', __FILE__)
def kill_delayed(path)
begin
pid = File.read(path).strip
Process.kill(0, pid.to_i)
false
rescue
true
end
end
kill_delayed(dj_pid_path)
begin
File.delete(dj_pid_path)
rescue Errno::ENOENT # file does not exist
end
# spawn delayed
env = ARGV[1]
puts "spawing delayed job in the same env: #env"
# edited, next line has been replaced with the following on in order to ensure delayed job is running in the same environment as the one that spawned it
#Process.spawn("ruby script/delayed_job start")
system( "RAILS_ENV" => env, "ruby script/delayed_job start")
puts "delayed_job ready."
现在我可以在任何我想要的地方请求这个文件,包括 'script/rails' 和 'config/unicorn.rb' 这样做:
# in top of script/rails
START_DELAYED_PATH = File.expand_path('../start_delayed_job', __FILE__)
require "#START_DELAYED_PATH"
# in config/unicorn.rb, before before_fork, different expand_path
START_DELAYED_PATH = File.expand_path('../../script/start_delayed_job', __FILE__)
require "#START_DELAYED_PATH"
【讨论】:
【参考方案4】:不是很好,但可以工作
免责声明:我说不好,因为这会导致定期重启,这对许多人来说是不可取的。并且简单地尝试启动可能会导致问题,因为如果创建重复实例,DJ 的实现会锁定队列。
您可以安排定期运行的cron
任务来启动相关作业。由于 DJ 在作业已经运行时将启动命令视为无操作,因此它可以正常工作。这种方法还可以处理 DJ 因主机重启以外的其他原因而死亡的情况。
# crontab example
0 * * * * /bin/bash -l -c 'cd /var/your-app/releases/20151207224034 && RAILS_ENV=production bundle exec script/delayed_job --queue=default -i=1 restart'
如果您使用像 whenever
这样的 gem,这非常简单。
every 1.hour do
script "delayed_job --queue=default -i=1 restart"
script "delayed_job --queue=lowpri -i=2 restart"
end
【讨论】:
以上是关于windows延迟启动程序批处理的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PowerShell 在系统重新启动后延迟 10 分钟在 Windows 任务计划程序中安排任务?