-1

我刚刚创建了一个控制台应用程序,它将由 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 秒左右创建一次。所以我去管理工作室并停止工作,但它抛出一个错误,说它无法停止,因为它没有运行。

4

1 回答 1

0

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

SQL Server 代理是一个单独的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 秒。Stop此外,这是通过 Management Studio 的选项可以发挥作用的唯一时间段。

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

如果您的 DBA 需要:

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

希望有帮助。

于 2013-04-02T16:24:22.090 回答