python 模块的终端和 bash 脚本之间的奇怪行为差异
Strange behaviour difference between terminal and bash script for python module
我安装了一个 python 脚本来更新我的 nextcloudpi 的 dyndns 记录:
https://github.com/Domain-Connect/DomainConnectDDNS-Python
当我 运行 从终端使用 domain-connect-dyndns update --all
程序时,它运行良好。
现在我创建了一个系统服务和一个调用该服务的计时器。该服务正在调用一个非常简单的 bash 文件:
#!/bin/bash
/home/pi/.local/bin/domain-connect-dyndns update --all
当我检查服务的执行时,结果是这样的:
pi@nextcloudpi:~ $ systemctl status ddns.service
● ddns.service - Update IONOS DNS Record
Loaded: loaded (/etc/systemd/system/ddns.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2020-10-18 20:20:10 BST; 45s ago
Process: 18391 ExecStart=/bin/bash /home/pi/own-bashscripts/execddns.sh (code=exited, status=1/FAILURE)
Main PID: 18391 (code=exited, status=1/FAILURE)
Oct 18 20:20:06 nextcloudpi systemd[1]: Started Update IONOS DNS Record.
Oct 18 20:20:10 nextcloudpi bash[18391]: Couldn't read setttings.
Oct 18 20:20:10 nextcloudpi bash[18391]: Traceback (most recent call last):
Oct 18 20:20:10 nextcloudpi bash[18391]: File "/home/pi/.local/bin/domain-connect-dyndns", line 10, in <module>
Oct 18 20:20:10 nextcloudpi bash[18391]: sys.exit(main())
Oct 18 20:20:10 nextcloudpi bash[18391]: File "/home/pi/.local/lib/python3.7/site-packages/dyndns/command_line.py
Oct 18 20:20:10 nextcloudpi bash[18391]: domains = config.keys()
Oct 18 20:20:10 nextcloudpi bash[18391]: UnboundLocalError: local variable 'config' referenced before assignment
Oct 18 20:20:10 nextcloudpi systemd[1]: ddns.service: Main process exited, code=exited, status=1/FAILURE
Oct 18 20:20:10 nextcloudpi systemd[1]: ddns.service: Failed with result 'exit-code'.
谁能告诉我我错过了什么?为什么 python 问题仅在我使用脚本调用它时出现,而当我从终端执行它时一切正常?
谢谢
脚本找不到 settings.py
。您需要在服务配置文件中设置 WorkingDirectory
config 或在脚本参数中提供设置路径:
# don't forget to change the path
domain-connect-dyndns update --all --config /home/pi/ddnsdir/settings.txt
这取决于您的环境。当您使用终端时,您有一个特殊的环境。要查看您的环境中有什么,您可以 运行:
env | less
当 systemd 启动您的脚本时,它使用不同的环境。要检查它,请将您的环境从脚本传输到日志文件。它可能是扩展的 $PATH 或 script-env.
中缺少的另一个导出变量
我安装了一个 python 脚本来更新我的 nextcloudpi 的 dyndns 记录:
https://github.com/Domain-Connect/DomainConnectDDNS-Python
当我 运行 从终端使用 domain-connect-dyndns update --all
程序时,它运行良好。
现在我创建了一个系统服务和一个调用该服务的计时器。该服务正在调用一个非常简单的 bash 文件:
#!/bin/bash
/home/pi/.local/bin/domain-connect-dyndns update --all
当我检查服务的执行时,结果是这样的:
pi@nextcloudpi:~ $ systemctl status ddns.service
● ddns.service - Update IONOS DNS Record
Loaded: loaded (/etc/systemd/system/ddns.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2020-10-18 20:20:10 BST; 45s ago
Process: 18391 ExecStart=/bin/bash /home/pi/own-bashscripts/execddns.sh (code=exited, status=1/FAILURE)
Main PID: 18391 (code=exited, status=1/FAILURE)
Oct 18 20:20:06 nextcloudpi systemd[1]: Started Update IONOS DNS Record.
Oct 18 20:20:10 nextcloudpi bash[18391]: Couldn't read setttings.
Oct 18 20:20:10 nextcloudpi bash[18391]: Traceback (most recent call last):
Oct 18 20:20:10 nextcloudpi bash[18391]: File "/home/pi/.local/bin/domain-connect-dyndns", line 10, in <module>
Oct 18 20:20:10 nextcloudpi bash[18391]: sys.exit(main())
Oct 18 20:20:10 nextcloudpi bash[18391]: File "/home/pi/.local/lib/python3.7/site-packages/dyndns/command_line.py
Oct 18 20:20:10 nextcloudpi bash[18391]: domains = config.keys()
Oct 18 20:20:10 nextcloudpi bash[18391]: UnboundLocalError: local variable 'config' referenced before assignment
Oct 18 20:20:10 nextcloudpi systemd[1]: ddns.service: Main process exited, code=exited, status=1/FAILURE
Oct 18 20:20:10 nextcloudpi systemd[1]: ddns.service: Failed with result 'exit-code'.
谁能告诉我我错过了什么?为什么 python 问题仅在我使用脚本调用它时出现,而当我从终端执行它时一切正常? 谢谢
脚本找不到 settings.py
。您需要在服务配置文件中设置 WorkingDirectory
config 或在脚本参数中提供设置路径:
# don't forget to change the path
domain-connect-dyndns update --all --config /home/pi/ddnsdir/settings.txt
这取决于您的环境。当您使用终端时,您有一个特殊的环境。要查看您的环境中有什么,您可以 运行:
env | less
当 systemd 启动您的脚本时,它使用不同的环境。要检查它,请将您的环境从脚本传输到日志文件。它可能是扩展的 $PATH 或 script-env.
中缺少的另一个导出变量