欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

jamf 为什么 安装某某开机仅运行一次策略 推送 策略失败,,,,,,,,,,,,,,能在哪里看出有没有推送 chatgpt 有大用 有大大用

jamf 为什么 推送 策略失败,,,,能在哪里看出有没有推送

在 Jamf Pro 里,策略(Policy)是否推送成功,可以从以下几个地方确认:

1. Jamf Pro 控制台

  • 登录 Jamf Pro 控制台

  • 进入 Computers → Policies → [你的策略]

  • image.png

  • image.png

  • image.pngimage.png

  • 点击 Logs 标签页,可以看到:

    • 哪些设备已经执行(Completed)

    • 哪些设备失败(Failed)

    • 哪些设备还没执行(Pending)

2. 客户端(Mac 端)

在受管的 Mac 上,可以通过以下方法确认:

(1) Jamf Binary 日志

  • 在 Mac 上打开终端

  • 查看 jamf.log:

    tail -f /var/log/jamf.log


    里面会记录:

    • 策略是否下载到本机

    • 是否执行成功 / 失败原因

(2) 手动触发策略

  • 在终端运行:

    sudo jamf policy


    可以手动拉取最新的策略,并在终端里直接看到执行结果。

3. 推送机制

  • Jamf 的策略主要靠 check-in(心跳)MDM push 去触发:

    • Check-in:受管 Mac 默认每 15 分钟跟 Jamf Pro 联系一次。

    • MDM push:即时通知,但要依赖 APNs(Apple Push Notification service)。

  • 如果 Mac 没联网,或 APNs 被阻断,策略就可能不会立刻推送。


👉 所以你可以先在 Jamf Pro 控制台 → 策略日志 看状态,再去 Mac 本地 /var/log/jamf.log 验证有没有收到推送。

要不要我给你写一段 脚本,可以在 Mac 上快速检测策略有没有被推送和执行?


给我写一段 脚本,可以在 Mac 上快速检测策略有没有被推送和执行?

我给你写一个 一键检测脚本,能在 Mac 上快速检查 Jamf 策略:

  1. 查看本机 Jamf 版本

  2. 列出 Scope 到本机的策略jamf policy -verbose

  3. /var/log/jamf.log 提取 已执行过的策略

  4. 输出差集 → 哪些策略被推送了但是还没执行


脚本内容(Bash)

#!/bin/bash # jamf_policy_check.sh # 检查 Jamf 策略是否被推送并执行 JAMF_LOG="/var/log/jamf.log" TMP_VERBOSE="/tmp/jamf_policy_verbose.txt" echo "========== Jamf 策略检查工具 ==========" # 1. 检查 Jamf 版本 echo ">>> Jamf 版本:" jamf version echo # 2. 拉取策略列表 echo ">>> 拉取 Scope 到本机的策略 (jamf policy -verbose)..." sudo jamf policy -verbose > "$TMP_VERBOSE" 2>/dev/null ALL_POLICIES=$(grep "Executing Policy" "$TMP_VERBOSE" | sed -E 's/.*Executing Policy (.*)/\1/') if [ -z "$ALL_POLICIES" ]; then    echo "⚠️  没有检测到任何可用策略 (可能已经全部执行过,或者 Scope 不包含此设备)。"    exit 0 fi echo echo "=== Scope 到本机的策略 ===" echo "$ALL_POLICIES" | sort | uniq echo "=======================================" echo # 3. 已执行策略 echo ">>> 从 jamf.log 提取已执行策略..." EXECUTED_POLICIES=$(grep "Executing Policy" "$JAMF_LOG" | sed -E 's/.*Executing Policy (.*)/\1/' | sort | uniq) if [ -z "$EXECUTED_POLICIES" ]; then    echo "⚠️  还没有执行过任何策略。" else    echo "=== 已执行的策略 ==="    echo "$EXECUTED_POLICIES"    echo "=======================================" fi echo # 4. 未执行策略 echo ">>> 检查未执行的策略:" MISSING=false for policy in $ALL_POLICIES; do    if ! echo "$EXECUTED_POLICIES" | grep -q "$policy"; then        echo "❌ 未执行: $policy"        MISSING=true    fi done if [ "$MISSING" = false ]; then    echo "✅ 所有 Scope 到的策略都已执行。" fi echo echo "检查完成 ✅"



使用方法

  1. 保存为 jamf_policy_check.sh

  2. 给执行权限:

    chmod +x jamf_policy_check.sh


  3. 运行:

    ./jamf_policy_check.sh



⚡ 脚本会输出:

  • Jamf 版本

  • Scope 到的策略

  • 已执行的策略

  • 未执行的策略(重点关注)


要不要我帮你加一个 实时监听模式(自动 tail -f /var/log/jamf.log,一旦有新策略执行就提示你)?


image.png

AA SPCTL disable Login, Startup, Check-in, Network State Change, Enrollment

AA-Wifi-MST-Only Network State Change

AAES_JAMF-M Login, Startup, Check-in, Network State Change

uninstall NPI blacklist software Login, Startup, Check-in

Update Inventory Check-in

安装 某某某 开机仅运行一次推送 Login, Startup, Check-in, Network State Change, Enrollment


在 /var/log/jamf.log 文件里,看到 后面三个策略 没有执行到

你贴的这些策略对应的 触发条件 (Triggers) 已经很清楚了:

  • Login → 用户登录时触发

  • Startup → 设备开机时触发

  • Check-in → 默认 15 分钟一次心跳触发

  • Network State Change → 网络状态变化(例如 Wi-Fi 切换、有线插拔)时触发

  • Enrollment → 设备注册时触发


你在 /var/log/jamf.log 里看到 后面三个策略没执行,通常有几个排查方向:

1. 策略有没有被 Scope 到这台设备

  • 在 Jamf Pro 控制台 → 策略 → Scope 里确认

  • 如果设备不在目标范围内(Smart Group / Static Group),即使触发了也不会执行。

2. 触发条件是否真正发生

  • 举例:

    • Login → 需要用户实际登录一次才会执行。

    • Startup → 必须是冷启动才触发,重启/休眠唤醒不算。

    • Check-in → 要等设备心跳报到,如果设备长时间离线就不会触发。

    • Network State Change → 必须有网络切换,静态不变不会触发。

👉 可以手动执行:

sudo jamf policy -event <自定义触发器名>

如果策略设置了 Custom Trigger,就要用上面命令跑。


3. Jamf Policy 日志里能看到

  • 在 Jamf Pro Web 控制台 → 策略 → Logs
    看看是否显示为 PendingNot Triggered


4. 常见原因

  • Scope 不对(设备不在策略范围里)。

  • Execution Frequency 只允许一次,而设备之前已经跑过。

  • Network State Change 没有发生(例如一直在同一个 Wi-Fi 下)。

  • Enrollment 触发 只在首次注册时执行,后面不会再跑。


要精确定位的话,你可以在目标 Mac 上跑:

sudo jamf policy -verbose


它会列出设备当前能拿到的所有策略和执行情况。


要不要我帮你写一个 检查脚本,自动从 /var/log/jamf.logjamf policy -verbose 输出里筛选出哪些策略被 Scope 到但还没执行?



# sudo jamf policy -verbose

 Password: 

 verbose:JAMF binary already symlinked

 verbose: Checking for an existing instance of this application. 

 This policy trigger is already being run: root 17090.00.1 4110 6840021088??S

 11:55上午 

 0:00.08

 /usr/local/jamf/bin/jamf policy-event CLIENT CHECKIN -stopConsoleLogs verbose:Policyerror code:51


你跑 sudo jamf policy -verbose 的输出里有几个关键信息:

This policy trigger is already being run: root ... Policy error code: 51


这说明:

1. “This policy trigger is already being run: root”

  • 表示系统里已经有一个 jamf policy 进程在跑了(可能是自动 Check-in 触发的,或者你前面已经手动跑过一次还没结束)。

  • 所以新的 jamf policy 命令被拒绝执行。

👉 可以用命令查一下有没有残留进程:

ps aux | grep jamf


如果看到卡住的 jamf policy,可以先杀掉:

sudo killall jamf


然后再跑一次:

sudo jamf policy -verbose



2. Policy error code: 51

  • error code: 51 在 Jamf 里通常意味着 Policy execution failed / invalid trigger

  • 可能原因:

    • 策略设置了 Custom Trigger,而你只是用默认的 check-in 去触发,结果没有匹配。

    • 策略的 Scope 或条件不满足(比如 Execution Frequency 设置成 “Once per computer”,已经跑过一次了)。

    • 依赖的文件/脚本丢失或权限不对,Jamf 执行时报错。


3. 怎么排查

  • 先清掉 jamf 卡死进程,重新跑:

    sudo killall jamf sudo jamf policy -verbose


  • 如果还是报 error code: 51,建议直接指定触发器试试:

    sudo jamf policy -event "<自定义触发器名>"


    触发器名可以在 Jamf Pro 控制台里,策略详情页 → General → Custom Event Trigger 找到。

  • 同时检查本机日志:

    tail -n 50 /var/log/jamf.log


    看具体是哪条策略报错。


要不要我帮你写一个小脚本,自动检测 哪些 jamf policy 进程卡住 + 哪条策略报错 + 对应 error code 含义,这样你不用手动一条条查?


sudo jamf policy 与 sudo  jamf policy -verbose 区别

sudo jamf policy 和 sudo jamf policy -verbose 是用于触发 Jamf Pro 策略执行的命令,两者的核心区别在于 输出信息的详细程度。以下是具体分析:


1. sudo jamf policy(基础命令)

  • 功能
    检查并执行符合条件的策略(根据策略的触发条件、作用范围等)。

  • 输出信息

    • 仅显示 关键信息(如策略是否被触发、执行结果是否成功)。

    • 适用于日常快速检查或脚本中无需详细日志的场景。

  • 示例输出

    plaintext
    Checking for policies triggered by "event"... Executing Policy 1: Install Firefox Policy execution completed.

2. sudo jamf policy -verbose(详细模式)

  • 功能
    同样执行策略,但会输出 详细的调试信息

  • 输出信息

    • 策略未触发的具体原因(如作用范围不匹配、频率限制等)。

    • 脚本或包安装失败的详细错误日志。

    • 显示策略执行的 全流程(如策略的检查过程、条件评估、脚本输出、文件下载进度等)。

    • 适用于 故障排查,例如:

  • 示例输出

    plaintext
    Checking for policies triggered by "event"... Evaluating policy ID 123 (Install Firefox)... - Checking scope: Device is in scope (Group: "All Devices"). - Checking frequency: Policy can run (not within 10-minute window). - Downloading package "Firefox.pkg" (100% complete). - Running script "Post-install Check" (exit code 0). Policy execution successful.

何时使用哪种命令?

场景推荐命令
快速检查策略是否执行sudo jamf policy
排查策略未触发的原因sudo jamf policy -verbose
调试脚本或安装包失败-verbose 模式
自动化脚本(仅需结果)基础命令

其他常用参数

  • -event <事件名称>:通过特定事件触发策略(如 sudo jamf policy -event update)。

  • -id <策略ID>:直接指定策略ID执行(跳过条件检查)。

通过结合 -verbose 和这些参数,可以更精准地控制策略执行并获取调试信息。


我帮你写一个 检查脚本,自动从 /var/log/jamf.log 和 jamf policy -verbose 输出里筛选出哪些策略被 Scope 到但还没执行?

那我给你做一个 检查 Jamf 策略执行情况的脚本,能同时:

  1. jamf policy -verbose 里解析出设备当前能拉到的策略

  2. /var/log/jamf.log 里比对哪些策略执行过

  3. 最后输出 Scope 到但未执行的策略列表

脚本如下(bash):

#!/bin/bash # check_jamf_policies.sh # 检查 Jamf 策略是否已经在本机执行 JAMF_LOG="/var/log/jamf.log" TMP_VERBOSE="/tmp/jamf_policy_verbose.txt" echo ">>> 拉取策略清单 (jamf policy -verbose)..." sudo jamf policy -verbose > "$TMP_VERBOSE" 2>/dev/null # 从 verbose 输出里提取策略名字 ALL_POLICIES=$(grep "Executing Policy" "$TMP_VERBOSE" | sed -E 's/.*Executing Policy (.*)/\1/') echo echo "=== 当前 Scope 到本机的策略 ===" echo "$ALL_POLICIES" | sort | uniq echo "================================" echo echo ">>> 检查 jamf.log 已执行的策略..." EXECUTED_POLICIES=$(grep "Executing Policy" "$JAMF_LOG" | sed -E 's/.*Executing Policy (.*)/\1/' | sort | uniq) echo "=== 已执行过的策略 ===" echo "$EXECUTED_POLICIES" echo "================================" echo echo ">>> 未执行的策略如下:" for policy in $ALL_POLICIES; do    if ! echo "$EXECUTED_POLICIES" | grep -q "$policy"; then        echo "❌ $policy"    fi done echo echo "检查完成。"



使用方法:

  1. 保存为 check_jamf_policies.sh

  2. 给权限:

    chmod +x check_jamf_policies.sh


  3. 运行:

    ./check_jamf_policies.sh



这个脚本会输出三部分:

  • Scope 到的策略(从 jamf policy -verbose 拿到)

  • 已经执行过的策略(从 /var/log/jamf.log 查)

  • 未执行的策略(差集)


要不要我再帮你加一段逻辑:检测 策略触发条件(Login / Startup / Check-in / Network State Change),告诉你为啥还没跑?



普通分类: