ラベル launchctl の投稿を表示しています。 すべての投稿を表示
ラベル launchctl の投稿を表示しています。 すべての投稿を表示

2025年10月2日木曜日

StableDiffusionWebUI を launchctl で管理する

StableDiffusionWebUI を launchctl で管理する

概要

plist を作成し launchctl に登録すると管理が楽になります

環境

  • macOS 15.7

local.mac.sdwebui.plist

今回の設定は Mac 起動時に自動で SD-WebUI も起動する設定です
停止した場合に自動で再起動したい場合は KeepAlive=true を設定します

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>local.mac.sdwebui</string>
  
    <key>ProgramArguments</key>
    <array>
      <string>/bin/bash</string>
      <string>/Users/user01/Documents/work/stable-diffusion-webui-forge/webui.sh</string>
      <string>--force-upcast-attention</string>
      <string>--listen</string>
      <string>--api</string>
    </array>
  
    <key>WorkingDirectory</key>
    <string>/Users/user01/Documents/work/stable-diffusion-webui-forge</string>
  
    <key>StandardOutPath</key>
    <string>/tmp/sdwebui.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/sdwebui.err</string>

    <key>RunAtLoad</key>
    <true/>
  </dict>
</plist>
  • cp local.mac.sdwebui.plist ~/Library/LaunchAgents/
  • launchctl load ~/Library/LaunchAgents/local.mac.sdwebui.plist

起動停止

  • launchctl start local.mac.sdwebui
  • launchctl stop local.mac.sdwebui

最後に

ターミナルを立ち上げてフォアグラウンドでプロセス管理すると辛い場合には素直に launchctl 化しましょう

2025年9月29日月曜日

launchctl に登録した plist がいつ実行されるのか確認する方法

launchctl に登録した plist がいつ実行されるのか確認する方法

概要

直接 plist を見るしかないのでシェルスクリプトを使いましょう

環境

  • macOS 15.7

シェルスクリプト

#!/bin/bash

# launchctl list で "local.mac" を含むタスクのラベルを取得
labels=$(launchctl list | grep local.mac | awk '{print $3}')

echo "Label -> Schedule"

for label in $labels; do
    # plist の候補パス
    plist_path=""
    for dir in ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons /System/Library/LaunchDaemons; do
        if [ -f "$dir/$label.plist" ]; then
            plist_path="$dir/$label.plist"
            break
        fi
    done

    if [ -z "$plist_path" ]; then
        echo "$label -> plist not found"
        continue
    fi

    # plist を JSON に変換して jq でパース
    json=$(plutil -convert json -o - "$plist_path" 2>/dev/null)
    if [ -z "$json" ]; then
        echo "$label -> failed to parse plist"
        continue
    fi

    echo "$label ->"

    # RunAtLoad
    run_at_load=$(echo "$json" | jq -r '.RunAtLoad // empty')
    if [ "$run_at_load" == "true" ]; then
        echo "  RunAtLoad: true"
    fi

    # StartInterval
    start_interval=$(echo "$json" | jq -r '.StartInterval // empty')
    if [ -n "$start_interval" ]; then
        echo "  StartInterval: every $start_interval seconds"
    fi

    # StartCalendarInterval (複数対応)
    intervals=$(echo "$json" | jq -c '.StartCalendarInterval // empty')
    if [ -n "$intervals" ]; then
        echo "  StartCalendarInterval:"
        echo "$intervals" | jq -r 'if type=="array" then .[] else . end | "    Hour: \(.Hour // "-"), Minute: \(.Minute // "0")"' 
    fi

    echo "-------------------------"
done

出力結果

Label -> Schedule
local.mac.1 ->
  StartCalendarInterval:
    Hour: 1, Minute: 0
    Hour: 4, Minute: 0
    Hour: 7, Minute: 0
    Hour: 10, Minute: 0
    Hour: 13, Minute: 0
    Hour: 16, Minute: 0
    Hour: 19, Minute: 0
    Hour: 22, Minute: 0
-------------------------
local.mac.2 ->
  StartCalendarInterval:
    Hour: 8, Minute: 0
-------------------------
local.mac.3 ->
  StartCalendarInterval:
    Hour: 8, Minute: 5
-------------------------
local.mac.4 ->
  StartCalendarInterval:
    Hour: 5, Minute: 30
    Hour: 11, Minute: 30
    Hour: 17, Minute: 30
    Hour: 23, Minute: 30
-------------------------
local.mac.5 ->
  StartCalendarInterval:
    Hour: 9, Minute: 0
    Hour: 12, Minute: 0
    Hour: 18, Minute: 0
    Hour: 21, Minute: 0
-------------------------
local.mac.6 ->
  StartCalendarInterval:
    Hour: 8, Minute: 5
-------------------------

最後に

もっと簡単に確認できる方法はないだろうか