【问题标题】:How to stop a SQL Server Job that runs without being running如何停止运行而不运行的 SQL Server 作业
【发布时间】:2013-04-01 19:12:24
【问题描述】:

我刚刚创建了一个控制台应用程序,它将由 Job 每天启动。这是一个概念证明。我的主要目的是检查数据库中的一些记录。这个证明只是一个控制台应用程序,它在 HD 中创建一个带有时间戳的文件。像这样

class Program
{
    static void Main(string[] args)
    {
        WriteToFile();
    }

    static void WriteToFile()
    {
        StreamWriter SW;
        DateTime invocationTime = DateTime.Now;
        SW = File.CreateText("c:\\HelloJobOutput\\MyTextFile"+invocationTime.Millisecond.ToString()+".txt");
        SW.WriteLine("I was created at:" + invocationTime.ToString());

        SW.Close();

    }
}

作业未分类,因为我不知道这意味着什么,我对作业调度真的很陌生。操作系统 cmdExec 类型的作业只有一个步骤,其命令是控制台应用程序可执行文件的完整路径,并计划在全天每 10 秒运行一次。成功时它会退出报告成功。

怎么了?好吧,我开始工作,它开始运行良好,创建了文件并且时间戳没问题,然后我关闭了工作执行对话框窗口,并且每隔 10 秒左右继续创建文件。所以我去管理工作室并停止工作,但它抛出一个错误,说它不能停止,因为它没有运行。

【问题讨论】:

  • 如果您尝试disabling,文件创建会停止吗?也许,如果还没有完成,还 modify 清除您设置的时间表的工作?
  • 您为创建作业执行的具体命令是什么?
  • @nkvu 是的,当我禁用该作业时,它会停止运行,一旦我再次启用它,它就会自动开始运行。我的意思是,无需重新开始。清除日程是什么意思?
  • @Pete 我使用的命令是:C:\COEM\Publish\HelloJob\HelloJob.exe
  • 请重新阅读我的问题。

标签: c# sql jobs


【解决方案1】:

[nkvu - 将其移出 cmets,因为它可能会变得详细/不可读。另外,我会尽力解释,但很高兴有更正/编辑,因为我不是专家。]

SQL Server Agent 是一个单独的 Windows 服务,它运行您定义的作业,如果它们没有被禁用并且有一个活动的计划(例如,在您的情况下每 10 秒)。因为它作为 Windows 服务运行,并且为此目的是独立的,所以您不需要任何手动干预即可让您的作业运行 - SQL Server 代理将检查活动作业及其计划,并在适当时自动启动作业(在这种情况下每 10 秒一次)。

这里的关键是,如果一个作业有一个活动的计划,它确实意味着它正在运行,只是它能够运行。如果我们跟踪这些步骤(我已经在每个步骤旁边描述了作业所处的“状态”):

  1. 作业已定义、已启用并有时间表(作业活动,未运行)
  2. 计划激活(按 10 秒间隔)并且 SQL Server 代理使用您提供的任何定义启动您的作业,在这种情况下,它启动控制台应用程序 HelloJob.exe (作业运行)
  3. 举例来说,假设您的控制台应用程序需要 5 秒执行 (作业运行 5 秒)
  4. 作业完成,因为 10 秒的间隔我们有一段时间,比如 5 秒,在下一次运行之前 (作业活动,未运行/静止)
  5. 计划激活,SQL Server 代理再次启动您的作业(正在运行)

在上文中,您的作业实际上仅在第 3 步中被视为在该 5 秒的时间间隔内运行,并且只会报告为在该 5 秒内运行。此外,这是通过 Management Studio 的 Stop 选项可以执行任何有效操作的唯一时间段。

此外,Start 选项不会启动您的计划运行,但如果您的 DBA 需要在其正常/常规计划之外一次性运行作业(或者如果有只需要在极少数情况下手动运行的作业)。作为一个场景,假设我有一个工作,它每晚运行一次 @ 晚上 11 点,将表的内容转储到 CSV 文件以供另一个应用程序获取,但我第二天早上来(错误,这里没有监控场景)并看到 CSV 文件没有被创建...然后我可以去工作并手动运行它来创建 CSV。

如果您的 DBA 需要:

  • 停止执行当前正在运行的计划作业(例如,在 5 秒间隔内),然后他们可以使用Stop
  • 如果他们确实需要阻止某个作业运行,则禁用它或删除为该作业定义的计划(可能还有其他方法,但这些是我熟悉的方法)

希望对您有所帮助。

【讨论】:

  • 当然有帮助。我真的不明白这份工作是如何工作的,它确实帮助我理解和交流。
猜你喜欢
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
相关资源
最近更新 更多