通过 USBmount 从 run-parts 调用时 Python 脚本未运行

通过 USBmount 从 run-parts 调用时 Python 脚本未运行

我正在运行 Ubuntu Server,并且有一个 Python 脚本,我试图让它在插入 USB 驱动器时自动运行,但是当 usbmount 执行其 run-parts 命令时,该脚本不会运行。如果我自己运行 run-parts,脚本会运行良好。我已将一些日志记录放入我的 bash 脚本中,它显示当插入 USB 驱动器时实际上正在调用该脚本,它只是不执行我的 Python 脚本。

我为此苦恼了一整天,我想也许存在权限问题,不允许 usbmount 执行 python 脚本,但如果存在的话,我也无法弄清楚。

澄清:我在 /etc/usbmount/mount.d 中有一个 shell 脚本,它在被调用时会记录,然后调用我的 python 脚本。

答案1

不确定 usbmount,但这是类似情况的原因:/etc/dhcp/dhclient-exit-hooks.d/ 在特定情况下,钩子由/bin/dhclient-scriptas执行来源(即使用.)。run-parts仅被调用来获取该文件夹中的脚本列表run-parts --list /etc/dhcp/dhclient-exit-hooks.d/

长话短说,剧本必须脚本。见下文。但是,没有什么可以阻止您从该 shell 脚本显式调用 python 解释器(见下文)。

# run given script
run_hook() {
    local script="$1"
    local exit_status=0

    if [ -f $script ]; then
        . $script                  # <=== must be shell script
        exit_status=$?
    fi

    if [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; then
        logger -p daemon.err "$script returned non-zero exit status $exit_status"
    fi

    return $exit_status
}

# run scripts in given directory
run_hookdir() {
    local dir="$1"
    local exit_status=0

    if [ -d "$dir" ]; then
        for script in $(run-parts --list $dir); do
            run_hook $script
            exit_status=$((exit_status|$?))
        done
    fi

    return $exit_status
}

调用python脚本的示例

#!/bin/bash
#
# Invoke a python script to update the DNS zone with the WLAN IP address
# The python script is in the same folder but not picked up by run-parts because its name contains a "."
#
PYTHON3_INTERPRETER=$(which python3)
THIS_FOLDER=/etc/dhcp/dhclient-exit-hooks.d
THE_SCRIPT=update_zone.py

${PYTHON3_INTERPRETER} ${THIS_FOLDER}/${THE_SCRIPT}

相关内容