我正在运行 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-script
as执行来源(即使用.
)。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}