TWSNMP FC:Windowsのタスクスケジューラーの設定をGO言語から行う方法を習得
今朝は5時から開発を開始しました。TWSNMPの起動ツールの続きです。前から調べていたWindows環境のタスクスケジューラーへTWSNMP FCやセンサーの起動を登録する機能を作っています。方法はGO言語からWindows標準のschtasks.exeというコマンド
を使ってタスクの登録/削除/起動/停止を行う方法です。
登録の有無は、
// findTask : タスクを検索する
func (b *App) findTask(name string) error {
if runtime.GOOS != "windows" {
return fmt.Errorf("not windows")
}
cmd := exec.CommandContext(b.ctx, "schtasks.exe", "/Query", "/TN", "\\TWSNMP\\"+name, "/XML")
return cmd.Run()
}
のような処理で検索できます。
登録は、
// createTask : タスクを登録する
func (b *App) createTask(name string, params []string) error {
if runtime.GOOS != "windows" {
return fmt.Errorf("not windows")
}
cmd := exec.CommandContext(b.ctx,
"schtasks.exe", "/Create",
"/TN", "\\TWSNMP\\"+name,
"/SC", "ONSTART",
"/TR", "'"+b.getExec(name)+"'"+makeArg(params),
)
o, err := cmd.CombinedOutput()
if err != nil {
wails.LogError(b.ctx, fmt.Sprintf("create task out=%s err=%v", strings.TrimSpace(string(o)), err))
return err
}
return nil
}
のような感じです。起動するプログラムのパラメータをどのように渡すかで、少し悩みました。ポイントは、実行ファイルを’シングルクオートで囲むことです。
'e:/twsnmp/twsnmpfc.exe' -datastore "e:/twsnmp/datastore"
のような感じになります。そうするとスケジューラーの登録で実行ファイルと起動パラメータが別れて登録です。
しかし、今の状態だとタスクスケジューラーから起動した時に、コマンドプロンプトのWindowが表示されてしまうので調べています。
Windowsの場合、タスクスケジューラー経由でなくてもGO言語からTWSNMP FCやセンサープログラムを起動した時に、コマンドプロンプトのWindowが表示されます。こちらの問題は、
cmd := exec.Command(path, params...)
の後に、
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
のようにWindowを隠す設定をすれば解決できました。
タスクスケジューラーの方は、コマンドプロンプトの問題の他に、管理者権限で登録する必要があるなど他にも問題があるので、もう少し調査が必要です。
明日に続く
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。