r - R管道工api在控制台中工作,但不适用于systemd
问题描述
我有一个定期发送数据的气象站,并希望使用管道工制作一个 API 来接收和保存 JSON 数据。我的脚本是
# plumber.R
library(tidyverse)
library(lubridate)
#' @post /station
#' @serializer json
#' @param wind_direction_raw
#' @param rain_amount_raw
#' @param timestamp
#' @param elapsed_time
#' @param wind_speed_raw
#' @param message_id
function(req, wind_direction_raw, rain_amount_raw, timestamp,
elapsed_time, wind_speed_raw, message_id){
new_data <- tibble("wind_direction_raw" = wind_direction_raw,
"rain_amount_raw" = rain_amount_raw,
"wind_speed_raw" = wind_speed_raw,
"timestamp" = ymd_hms(paste(timestamp[1:6], collapse="="), tz = "UTC"),
"elapsed_time" = elapsed_time,
"message_id" = message_id)
write_path <- paste0("/home/pi/weather_station/data/weather_data_",
Sys.Date(), ".csv")
readr::write_csv(new_data, write_path, append=TRUE)
当我打开R
会话并输入
> library(plumber)
> weather_service <- pr('/home/pi/weather_station/weather_api/receive_json.R')
> pr_run(weather_service, port=9494, host='192.168.1.151')
然后在另一台计算机上用curl
with发送一些 json
curl -X POST -H "Content-Type: application/json" --data '{"elapsed_time": 6245, "timestamp": "[2020, 7, 26, 12, 2, 21, 6, 208]", "wind_direction_raw": 108, "wind_speed_raw": 5, "message_id": 666, "rain_amount_raw": "0"}' http://192.168.1.151:9494/station
它工作正常。和我实际的气象站一样。
但是,当我使用这个 systemd 服务文件时
[Unit]
Description=Plumber API
[Service]
ExecStart=/usr/bin/Rscript -e "library(plumber); pr_run(pr('/home/pi/weather_station/weather_api/receive_json.R'), port=9494, host='192.168.1.151')"
Restart= always
RestartSec=60
SyslogIdentifier=WeatherAPI
[Install]
WantedBy=multi-user.target
气象站和我的curl
例子都不能发送数据。它似乎挂在发送过程的中间,因为该curl
过程挂起并且永远不会完成。
sudo systemctl status
看起来不错
Feb 03 17:24:25 gatesPi4 systemd[1]: Started Plumber API.
Feb 03 17:24:29 gatesPi4 WeatherAPI[14465]: ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.0 ──
Feb 03 17:24:29 gatesPi4 WeatherAPI[14465]: ✔ ggplot2 3.3.2 ✔ purrr 0.3.4
Feb 03 17:24:29 gatesPi4 WeatherAPI[14465]: ✔ tibble 3.0.1 ✔ dplyr 1.0.0
Feb 03 17:24:29 gatesPi4 WeatherAPI[14465]: ✔ tidyr 1.1.0 ✔ stringr 1.4.0
Feb 03 17:24:29 gatesPi4 WeatherAPI[14465]: ✔ readr 1.3.1 ✔ forcats 0.5.0
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: ✖ tidyr::extract() masks magrittr::extract()
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: ✖ dplyr::filter() masks stats::filter()
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: ✖ dplyr::lag() masks stats::lag()
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: ✖ purrr::set_names() masks magrittr::set_names()
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: Attaching package: ‘lubridate’
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: The following objects are masked from ‘package:base’:
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: date, intersect, setdiff, union
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: Running plumber API at http://192.168.1.151:9494
Feb 03 17:24:30 gatesPi4 WeatherAPI[14465]: Running swagger Docs at http://192.168.1.151:9494/__docs__/
有任何想法吗?我尝试添加Users=pi
到服务文件,以用户身份而不是 root 身份运行,但行为没有改变。有任何想法吗?
解决方案
推荐阅读
- python - 为什么输出不是 1 和 1?
- javascript - Angular 中的单元测试用例轮询服务
- html - 是否可以在 Shopify 中的菜单项名称后添加标签?
- javascript - 如何编写具有零识别信息的真正安全的用户配置文件,他们可以重置密码?
- elixir - (CaseClauseError) 没有 case 子句匹配:%{syntax: :proto2}
- react-native - Linux 上 Pycharm 专业版中的 React-Native Android 和 iOS 模拟器
- python - 如何使用 pyenv 在 MacOS 上安装和使用不同版本的 python
- security - 与网站连接的赛普拉斯问题不安全?
- django - 无法通过 django 序列化程序上传多个文件
- django - 如何在 django 设置主页