这是我的单位文件:
[Unit]
Description=Backend Service
After=mariadb.service
Requires=mariadb.service
[Service]
Type=simple
ExecStart=/var/www/html/pythonscripts/Backend.py
[Install]
Alias=BEd
WantedBy=basic.target
这是我之前写的曾经有效的内容(设置服务的说明):
BEd.service must be moved to /etc/systemd/system
systemctl daemon-reload
systemctl enable BEd
systemctl start BEd
以下是 /etc/systemd/system 文件夹当前包含的内容:
basic.target.wants dbus-org.freedesktop.NetworkManager.service default.target.wants sockets.target.wants
BEd dbus-org.freedesktop.nm-dispatcher.service getty.target.wants sysinit.target.wants
BEd.service default.target multi-user.target.wants system-update.target.wants
这是重启后的错误信息:
[root@BEKappa ~]# systemctl status -l BHd
BEd.service - Backend Service
Loaded: loaded (/etc/systemd/system/BEd.service; enabled)
Active: failed (Result: exit-code) since Sat 2016-01-16 18:39:27 EST; 34s ago
Process: 3852 ExecStart=/var/www/html/pythonscripts/BEd.py (code=exited, status=1/FAILURE)
Main PID: 3852 (code=exited, status=1/FAILURE)
CGroup: /system.slice/BEd.service
Jan 16 18:39:27 BEKappa BEd.py[3852]: Traceback (most recent call last):
Jan 16 18:39:27 BEKappa BEd.py[3852]: File "/var/www/html/pythonscripts/BEd.py", line 147, in <module>
Jan 16 18:39:27 BEKappa BEd.py[3852]: cur.execute(network_adapters_sql)
Jan 16 18:39:27 BEKappa BEd.py[3852]: File "/usr/lib64/python2.7/site-packages/MySQLdb/cursors.py", line 174, in execute
Jan 16 18:39:27 BEKappa BEd.py[3852]: self.errorhandler(self, exc, value)
Jan 16 18:39:27 BEKappa BEd.py[3852]: File "/usr/lib64/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
Jan 16 18:39:27 BEKappa BEd.py[3852]: raise errorclass, errorvalue
Jan 16 18:39:27 BEKappa BEd.py[3852]: _mysql_exceptions.ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \'\'IP\', \'ethernet\', \'connecting\', \'(getting\', \'enp7s0\', \'yes\', \'1000\', \'"dhcp"\', )\' at line 1')
Jan 16 18:39:27 BEKappa systemd[1]: BEd.service: main process exited, code=exited, status=1/FAILURE
Jan 16 18:39:27 BEKappa systemd[1]: Unit BEd.service entered failed state.
我 100% 确定它不是服务代码,因为它在手动重新启动后启动得很好(即 systemctl start BEd)。
根据错误,我 90% 确定 BEd 启动时 mariaDB 尚未完成加载,它在程序的第一个 SQL 语句上失败。然而,这个单元文件以前可以工作,目前正在另一台服务器上工作。所以我很困惑。
答案1
由于“我的文件出了什么问题?”这个通用问题,您的问题很可能没有得到答案。下次尝试问一个具体的问题。
在这种情况下,您认为问题可能是 MySQL 之前的脚本准备好了。您可以确认是否是这样。手动关闭 MySQL 并运行脚本。它应该产生相同的结果。
您还可以向脚本添加错误检查,以确认它可以在继续之前连接到 MySQL。
如果问题确实是 MySQL 尚未启动,那么这是一个有趣的具体问题,因为您的配置似乎表明您要求首先启动 MySQL。
应该有一种方法可以解决 /that/ 问题systemd
,但您也可以通过更新脚本以在尝试执行任何操作之前休眠一分钟(或五分钟)来测试这是否确实是问题。这应该会给MySQL足够的时间来完成上线,然后再继续。
附带说明一下,我注意到您将 Python 脚本存储在 Web 根目录下。如果脚本并不总是要在 Web 上运行,则可以通过将其移至 Web 根目录之外来提高安全性。