Systemd 服务不会将 python 脚本写入文件,python 脚本在从 cli 执行时名义上运行
Systemd service does not write python script to file, python script runs nominally when executed from cli
使用 raspberry pi 零 w,设置一个脚本来监控 bme280 传感器,并将值写入文件。当脚本从命令行启动时,这非常有效,当脚本通过 systemd 启动时,文件不会被写入。请在下面找到脚本和 systemd 服务。
已将标准输出设置为绝对路径但没有成功,python 脚本写入指令也设置为绝对路径。
系统服务:
[Unit]
Description=bme280 sensor log startup
After=network.target
[Service]
ExecStart=/usr/bin/python3 -u /home/pi/bme.py
WorkingDirectory=/home/pi
StandardOutput=file:/home/pi/senselog.csv
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
python 脚本:
import time
from time import strftime
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location's pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
with open("/home/pi/senselog.csv", "a") as log:
while True:
temp_h = bme280.temperature
humidity = bme280.humidity
pressure = bme280.pressure
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str([temp_h,humidity,pressure])))
time.sleep(60)
如果我删除 senselog.csv 文件,那么在启动时 systemd 服务会创建新的文件但没有任何数据,我们将不胜感激。
StandardOutput
的 file
属性仅适用于 systemd
版本 236。您使用的是什么版本?
pi@wifi-relay:~ $ systemd --version
systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
如果版本低于 236 并且您t/don不想升级,您可以简单地将 ExecStart
行更新为:
/usr/bin/python3 -u /home/pi/bme.py >1 /home/pi/senselog.csv
...然后将 StandardOutput
行恢复为默认值。
所以解决方案是在 python 脚本中对我们正在写入的文件实际调用 .close() ,然后 systemd 服务会按预期工作。大声喊到这个线程:https://askubuntu.com/questions/83549/python-script-wont-write-data-when-ran-from-cron 最后一个答案 = f.close()
和工作脚本文件:
from time import strftime
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location's pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
with open("/home/pi/senselog.csv", "w") as log:
while True:
temp_h = bme280.temperature
humidity = bme280.humidity
pressure = bme280.pressure
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str([temp_h,humidity,pressure])))
log.close()
time.sleep(60) ```
使用 raspberry pi 零 w,设置一个脚本来监控 bme280 传感器,并将值写入文件。当脚本从命令行启动时,这非常有效,当脚本通过 systemd 启动时,文件不会被写入。请在下面找到脚本和 systemd 服务。
已将标准输出设置为绝对路径但没有成功,python 脚本写入指令也设置为绝对路径。
系统服务:
[Unit]
Description=bme280 sensor log startup
After=network.target
[Service]
ExecStart=/usr/bin/python3 -u /home/pi/bme.py
WorkingDirectory=/home/pi
StandardOutput=file:/home/pi/senselog.csv
StandardError=inherit
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
python 脚本:
import time
from time import strftime
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location's pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
with open("/home/pi/senselog.csv", "a") as log:
while True:
temp_h = bme280.temperature
humidity = bme280.humidity
pressure = bme280.pressure
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str([temp_h,humidity,pressure])))
time.sleep(60)
如果我删除 senselog.csv 文件,那么在启动时 systemd 服务会创建新的文件但没有任何数据,我们将不胜感激。
StandardOutput
的 file
属性仅适用于 systemd
版本 236。您使用的是什么版本?
pi@wifi-relay:~ $ systemd --version
systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
如果版本低于 236 并且您t/don不想升级,您可以简单地将 ExecStart
行更新为:
/usr/bin/python3 -u /home/pi/bme.py >1 /home/pi/senselog.csv
...然后将 StandardOutput
行恢复为默认值。
所以解决方案是在 python 脚本中对我们正在写入的文件实际调用 .close() ,然后 systemd 服务会按预期工作。大声喊到这个线程:https://askubuntu.com/questions/83549/python-script-wont-write-data-when-ran-from-cron 最后一个答案 = f.close()
和工作脚本文件:
from time import strftime
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c,address=0x76)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location's pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
with open("/home/pi/senselog.csv", "w") as log:
while True:
temp_h = bme280.temperature
humidity = bme280.humidity
pressure = bme280.pressure
log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str([temp_h,humidity,pressure])))
log.close()
time.sleep(60) ```