本記事は、タスク(%SYS.Task)についての備忘録になります。
はじめに
本記事は、Winsowsのタスクスケジューラとは異なる、IRIS/Cache固有のタスクの解説になります。
管理ポータルで確認するには、[システムオペレーション] > [タスクマネージャ] > [タスクスケジュール]と進むと、下記画面が表示されます。
登録・変更・削除等の操作は、基本的にこの画面で行う事になる思いますが、まれに「コマンドで追加/削除したい」とか、「一覧を表示したい」などの要望があったりなかったりします。
そんな時にお世話になるのが、クラス「%SYS.Task.cls」です。
管理ポータルで作成したタスクスケジューラも、このクラスに登録しています。
そのため、このクラスをコマンドやSQL等で操作する事により、追加/削除が可能になります。
SQLでタスク一覧を参照する
一先ず、全件全項目を確認するため、下記クエリを実行します。
select * from %SYS.Task
分かりやすいように管理ポータルで実行してみます。
ネームスペースの指定は無く、どのネームスペースでも実行可能です。
必用の是非はともかく、管理ポータルの表示に近づけるのであれば、下記項目をチョイスすれば良いと思います。
select
Name,
Type,
NameSpace,
Description,
ID,
Suspended,
DisplayFinished,
DisplayNextScheduled
from %SYS.Task
参照だけなら、こっちの方が見やすいな・・・(笑
タスクの登録/削除
%SYS.Taskを使い、タスクの登録と削除を行います。
%SYS.Taskは、親クラスに%SYS.TaskSuperが設定されており、プロパティ・関数等々は、ほぼこのクラスで設定されています。
タスクの実行やサスペンドの設定など、必要に応じてコマンドを使用して操作することが可能です。
詳細な操作方法や具体的な手順については、必要に応じて公式ドキュメントをご参照ください
タスクの登録
下記は、1日1回 午前1:00に実行するタスクの登録となります。
ClassMethod MakeTask()
{
s task = ##class(%SYS.Task).%New()
, task.Name = "コマンド追加タスク"
, task.Description = "説明:コマンドで追加しました"
, task.NameSpace = $namespace
, task.TaskClass = "%SYS.Task.RunLegacyTask" // 今回はレガシータスクを使用します
, task.Settings = $lb("ExecuteCode","d ##class(developer.Sample).killData()")
, task.TimePeriod = 0 // DAILY
, task.TimePeriodEvery = 1
, task.TimePeriodDay=""
, task.DailyFrequency = 0 // 日に1回実行
, task.DailyFrequencyTime = ""
, task.DailyStartTime = $zth("01:00:00") // 1:00に実行
, task.RunAsUser = "UnknownUser" // 実行ユーザ
w task.%Save()
}
コマンド実行後、タスクスケジューラを確認すると、下記タスクが登録されています。
タスクの削除
データクラスなので、%DeleteId()コマンドで削除が可能です。
IDが事前に取得できていればそのまま実行できますが、タスクの名称(Name)からIDを検索する事も可能です。
ClassMethod DeleteTask()
{
// タスクの名称からIDを取得する
s taskId = ##class(%SYS.Task).FindId("コマンド追加タスク")
i (taskId'=""){
w ##class(%SYS.Task).%DeleteId(taskId)
}
}
タスクのエクスポート/インポート
タスクはエクスポートして、別環境に同じタスクを設定する事が可能です。
エクスポート
ファイル名は任意ですが、拡張子は「.xml」になります。
%SYS.TaskSuperの親クラスに「%XML.Adaptor」が設定されているので、何となく察しますね。
ExportTasksの引数は、レコードID(%List)と出力先(ファイル名込み)になります。
ClassMethod ExportTask(exportFile As %String)
{
s idList = $lb(1001,1002) // レコードID=1001, 1002を出力する
w ##class(%SYS.TaskSuper).ExportTasks(idList, exportFile)
}
では、下記コマンドで実行してみましょう
d ##class(developer.task.Sample).ExportTask("D:\Temp\xml\exportedTasks.xml")
<?xml version="1.0" encoding="UTF-8"?>
<Tasks><Task>
<Name>Sample</Name>
<RunAsUser>UnknownUser</RunAsUser>
<EmailOutput>false</EmailOutput>
<Expires>true</Expires>
<OpenOutputFile>false</OpenOutputFile>
<OutputFileIsBinary>true</OutputFileIsBinary>
<SuspendOnError>false</SuspendOnError>
<SuspendTerminated>false</SuspendTerminated>
<Suspended>0</Suspended>
<Priority>0</Priority>
<TaskClass>%SYS.Task.RunLegacyTask</TaskClass>
<Settings>DQFFeGVjdXRlQ29kZSgBZCAjI2NsYXNzKGRldmVsb3Blci5TYW1wbGUpLmtpbGxEYXRhKCk=</Settings>
<IsBatch>false</IsBatch>
<NameSpace>SAMPLE</NameSpace>
<TimePeriod>0</TimePeriod>
<TimePeriodEvery>1</TimePeriodEvery>
<DailyFrequency>0</DailyFrequency>
<DailyFrequencyTime>1</DailyFrequencyTime>
<DailyStartTime>00:00:00</DailyStartTime>
<DailyEndTime>00:00:00</DailyEndTime>
<JobGUID>4ABA6270-6E54-4A80-A65A-1AFE3D74DC8C</JobGUID>
<StartDate>2024-12-19</StartDate>
<LastSchedule>0</LastSchedule>
<LastStarted>0</LastStarted>
<LastFinished>0</LastFinished>
<MirrorStatus>1</MirrorStatus>
<Type>2</Type>
<RescheduleOnStart>false</RescheduleOnStart>
<DeleteAfterRun>false</DeleteAfterRun>
<Description>サンプル用に登録</Description>
</Task>
<Task>
<Name>コマンド追加タスク</Name>
<RunAsUser>UnknownUser</RunAsUser>
<EmailOutput>false</EmailOutput>
<Expires>true</Expires>
<OpenOutputFile>false</OpenOutputFile>
<OutputFileIsBinary>true</OutputFileIsBinary>
<SuspendOnError>false</SuspendOnError>
<SuspendTerminated>false</SuspendTerminated>
<Suspended>0</Suspended>
<Priority>0</Priority>
<TaskClass>%SYS.Task.RunLegacyTask</TaskClass>
<Settings>DQFFeGVjdXRlQ29kZSgBZCAjI2NsYXNzKGRldmVsb3Blci5TYW1wbGUpLmtpbGxEYXRhKCk=</Settings>
<IsBatch>false</IsBatch>
<NameSpace>SAMPLE</NameSpace>
<TimePeriod>0</TimePeriod>
<TimePeriodEvery>1</TimePeriodEvery>
<DailyFrequency>0</DailyFrequency>
<DailyStartTime>01:00:00</DailyStartTime>
<DailyEndTime>00:00:00</DailyEndTime>
<JobGUID>501274AE-7B00-4648-8B0B-F63600729243</JobGUID>
<StartDate>2024-12-19</StartDate>
<LastSchedule>0</LastSchedule>
<LastStarted>0</LastStarted>
<LastFinished>0</LastFinished>
<MirrorStatus>1</MirrorStatus>
<Type>2</Type>
<RescheduleOnStart>false</RescheduleOnStart>
<DeleteAfterRun>false</DeleteAfterRun>
<Description>説明:コマンドで追加しました</Description>
</Task>
</Tasks>
インポート
インポートする際は、下記コマンドで行います。
ClassMethod InportTask(importFile As %String)
{
w ##class(%SYS.TaskSuper).ImportTasks(importFile)
}
ただ、一筋縄ではいかないパターンが多く、だいたいエラーになっているイメージです。
インポート時にエラーになった際は、下記エレメントやエラーステータス・メッセージ等のエレメントを削除するとうまくいくケースがあります。
LastSchedule, LastStarted, LastFinished
タスクのデータ
タスクのデータ(グローバル)はどこにあるでしょうか。
%SYS.TaskSuperのクラスを確認すると「^SYS(“Task”,”TaskD”)」と記述されています。
では、管理ポータルで ^SYS(“Task”,”TaskD”) グローバルを確認してみます。
発見。
最悪、ここをちょこちょこ弄るだけでも出来そうですね(笑)。
おわりに
いかがでしょうか。
さらっとですが、タスクのコマンド操作をご紹介しました。
今回の記事を参考に、ぜひ%SYS.Taskを活用してシステム管理を効率化してみてください。
公式ドキュメントや環境で実際に試してみることで、さらに理解が深まるはずです。
今回の記事で取り上げた内容について、ご意見やご質問がありましたら、ぜひコメント欄でお知らせください。
皆さんのご意見を参考に、さらなる情報を発信していきたいと考えています。
最後までお読みいただき、ありがとうございました。