自启动服务 Cannot read keys
odymit opened this issue · 11 comments
🐛 问题描述(Description)
想要开机启动,做成systemd服务的时候出错,具体报错信息如下。信息是无法获得 console 输入,有没有办法通过命令来欺骗程序呢?尝试了流重定向好像不行,另外好像还不能绑定 0.0.0.0 进行局域网访问,设置 0.0.0.0 后还是本地 127.0.0.1 地址。
● webdav.service - Web Dav sercive jbox
Loaded: loaded (/home/xxx/.config/systemd/user/webdav.service; disabled; preset: enabled)
Active: active (running) since Wed 2022-09-21 18:16:01 CST; 1s ago
Main PID: 44397 (sh)
Tasks: 17 (limit: 38070)
Memory: 21.0M
CPU: 474ms
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/webdav.service
├─44397 sh /home/xxx/.config/systemd/user/jbox-startup.sh
└─44399 ./JboxWebdav.ConsoleApp
Sep 21 18:24:27 hermit systemd[1428]: Started Web Dav sercive jbox.
Sep 21 18:24:28 hermit sh[44815]: Unhandled exception. System.InvalidOperationException: Cannot read keys when either application does not have a console or when console input has been redirected. Try Console.Read.
Sep 21 18:24:28 hermit sh[44815]: at System.ConsolePal.ReadKey(Boolean intercept)
Sep 21 18:24:28 hermit sh[44815]: at JboxWebdav.ConsoleApp.Program.Main(String[] args) in /home/runner/work/JboxWebdav/JboxWebdav/JboxWebdav.ConsoleApp/Program.cs:line 117
--------------------------------------------------------------------------------------------------------------------------------------------
Sep 21 18:24:32 hermit systemd[1428]: webdav.service: Main process exited, code=exited, status=134/n/a
Sep 21 18:24:32 hermit systemd[1428]: webdav.service: Failed with result 'exit-code'.
Sep 21 18:24:33 hermit systemd[1428]: webdav.service: Scheduled restart job, restart counter is at 5.
Sep 21 18:24:33 hermit systemd[1428]: Stopped Web Dav sercive jbox.
Sep 21 18:24:33 hermit systemd[1428]: webdav.service: Start request repeated too quickly.
Sep 21 18:24:33 hermit systemd[1428]: webdav.service: Failed with result 'exit-code'.
Sep 21 18:24:33 hermit systemd[1428]: Failed to start Web Dav sercive jbox.
webdav.service
[Unit]
Description = Web Dav sercive jbox
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Type = simple
ExecStart = sh /home/xxx/.config/systemd/user/jbox-startup.sh
Restart=always
[Install]
WantedBy = default.target
jbox-startup.sh
cd /home/xxx/Documents/JboxWebdav.ConsoleApp-Linux-x64 && ./JboxWebdav.ConsoleApp
绑定 0.0.0.0 后的效果:
~/Documents/JboxWebdav.ConsoleApp-Linux-x64 ❯ sh jbox-startup.sh
Welcome to JboxWebdav!
尝试登录...
Cookie登录成功。WebDAV 服务器运行中。按下 x 退出,按下 c 进入设置。监听地址:http://127.0.0.1:65472/
c
---设置---
1.更改监听地址(当前:http://127.0.0.1:65472/)2.停用/启用“交大空间”(当前:已启用)3.停用/启用“他人的分享链接”(当前:已启用)请输入数字1~3更改设置,留空退出 > 1
请输入新地址,留空不变 > 0.0.0.0
---设置---
1.更改监听地址(当前:0.0.0.0)2.停用/启用“交大空间”(当前:已启用)3.停用/启用“他人的分享链接”(当前:已启用)请输入数字1~3更改设置,留空退出 >
----------------------------------------------------------------------------------------
~/.config/systemd/user ❯ netstat -tunlp |grep 65472
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:65472 0.0.0.0:* LISTEN -
📷 复现步骤(Steps to Reproduce)
- 将 webdav.service 和 jbox-startup.sh 放入 systemd user 目录 /home/xxx/.config/systemd/user/
- systemctl --user daemon-reload
- systemctl --user start webdav
🚑 基本信息(Basic Information)
- 程序版本(Program Version): v0.11
- 系统版本号(OS Version): Arch Linux x86_64 5.15.68-1-lts
感谢反馈!第一个错误根据提示就是输入输出被重定向导致的,我看看有没有解决方法
第二个问题,先退出设置看看是否报错。若没报错应该正常监听了,报错则可能是权限不足
报错了,具体日志如下:
~/Doc/JboxWebdav.ConsoleApp-Linux-x64 ❯ sudo sh jbox-startup.sh
[sudo] username 的密码:Welcome to JboxWebdav!
尝试登录...
Cookie登录成功。WebDAV 服务器运行中。按下 x 退出,按下 c 进入设置。监听地址:http://127.0.0.1:65472/
c
---设置---
1.更改监听地址(当前:http://127.0.0.1:65472/)2.停用/启用“交大空间”(当前:已启用)3.停用/启用“他人的分享链接”(当前:已启用)请输入数字1~3更改设置,留空退出 > 1
请输入新地址,留空不变 > http://0.0.0.0:65472/
---设置---
1.更改监听地址(当前:http://0.0.0.0:65472/)2.停用/启用“交大空间”(当前:已启用)3.停用/启用“他人的分享链接”(当前:已启用)请输入数字1~3更改设置,留空退出 >
退出设置。Program - Fatal - The request is not supported.
出现严重错误,请更改正确的监听地址、确保程序有相关权限,然后重启程序!
Problem 1
正如提示说的
Cannot read keys when either application does not have a console or when console input has been redirected.
< fakeinput.txt
导致了错误的发生。事实上,调整配置可以用yaml
文件来实现(详见 https://1357310795.github.io/JboxWebdav/tip/Config.html )
Problem 2
根据 Microsoft 官方文档,监听所有地址应该用
http://+:65472/
感谢,Problem 2 解决了。
Problem 1 是我表述不清,我是因为触发了上述错误后才想到去输入流重定向欺骗程序存在输入,所以其实在不加 < fakerinput.txt
的情况下也会报错。
fakeinput.txt 是个空文件,我暂时并没有想通过输入流来进行配置。
在不加
< fakerinput.txt
的情况下也会报错。
报的什么错?我这里测试是没问题的。Kubuntu 22.04 LTS
就是这个:Cannot read keys when either application does not have a console or when console input has been redirected.
我怀疑是做成服务后,没有 console 然后又需要 console input,所以想到 < fakerinput.txt
试一下。
就是这个:
Cannot read keys when either application does not have a console or when console input has been redirected.
竟然做成服务后没有 Console……这我倒是没测试。那我明早出一个不使用 Console.Read 的版本吧。
OK了,下载最新生成的二进制文件( https://github.com/1357310795/JboxWebdav/suites/8430430696/artifacts/373344224 ),加上 -no-interactive
参数,实测能用
cd /home/XXX/下载/JboxWebdav/JboxWebdav.ConsoleApp/bin/Debug/net6.0/ && ./JboxWebdav.ConsoleApp -no-interactive >> webdav.log
十分感谢!经实测能用了,再报告一个不影响使用的小 bug,-c config.yml
和 -no-interactive
顺序不同时可能会导致配置文件失效,具体表现为监听地址是默认监听地址。
~ ❯ systemctl --user status webdav 10:33:50
● webdav.service - Web Dav sercive jbox
Loaded: loaded (/home/xxx/.config/systemd/user/webdav.service; disabled; preset: enabled)
Active: active (running) since Fri 2022-09-23 10:33:50 CST; 2s ago
Main PID: 8351 (sh)
Tasks: 19 (limit: 38070)
Memory: 23.3M
CPU: 545ms
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/webdav.service
├─8351 sh /home/xxx/.config/systemd/user/jbox-startup.sh
└─8353 ./JboxWebdav.ConsoleApp -c config.yml -no-interactive
Sep 23 10:33:50 hermit systemd[1420]: Started Web Dav sercive jbox.
Sep 23 10:33:50 hermit sh[8353]: Welcome to JboxWebdav!
Sep 23 10:33:50 hermit sh[8353]: 尝试登录...
Sep 23 10:33:50 hermit sh[8353]: Cookie登录成功。Sep 23 10:33:51 hermit sh[8353]: 配置文件读取成功!Sep 23 10:33:51 hermit sh[8353]: WebDAV 服务器运行中。按下 x 退出,按下 c 进入设置。Sep 23 10:33:51 hermit sh[8353]: 监听地址:http://+:65472/
~ ❯ systemctl --user stop webdav 10:33:53
~ ❯ systemctl --user status webdav 10:34:00
○ webdav.service - Web Dav sercive jbox
Loaded: loaded (/home/xxx/.config/systemd/user/webdav.service; disabled; preset: enabled)
Active: inactive (dead)
Sep 23 10:30:08 hermit systemd[1420]: Stopped Web Dav sercive jbox.
Sep 23 10:33:50 hermit systemd[1420]: Started Web Dav sercive jbox.
Sep 23 10:33:50 hermit sh[8353]: Welcome to JboxWebdav!
Sep 23 10:33:50 hermit sh[8353]: 尝试登录...
Sep 23 10:33:50 hermit sh[8353]: Cookie登录成功。Sep 23 10:33:51 hermit sh[8353]: 配置文件读取成功!Sep 23 10:33:51 hermit sh[8353]: WebDAV 服务器运行中。按下 x 退出,按下 c 进入设置。Sep 23 10:33:51 hermit sh[8353]: 监听地址:http://+:65472/
Sep 23 10:34:00 hermit systemd[1420]: Stopping Web Dav sercive jbox...
Sep 23 10:34:00 hermit systemd[1420]: Stopped Web Dav sercive jbox.
~ ❯ systemctl --user start webdav 10:34:03
~ ❯ systemctl --user status webdav 10:34:25
● webdav.service - Web Dav sercive jbox
Loaded: loaded (/home/xxx/.config/systemd/user/webdav.service; disabled; preset: enabled)
Active: active (running) since Fri 2022-09-23 10:34:25 CST; 2s ago
Main PID: 8388 (sh)
Tasks: 17 (limit: 38070)
Memory: 21.1M
CPU: 397ms
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/webdav.service
├─8388 sh /home/xxx/.config/systemd/user/jbox-startup.sh
└─8390 ./JboxWebdav.ConsoleApp -no-interactive -c config.yml
Sep 23 10:34:25 hermit systemd[1420]: Started Web Dav sercive jbox.
Sep 23 10:34:25 hermit sh[8390]: Welcome to JboxWebdav!
Sep 23 10:34:25 hermit sh[8390]: 尝试登录...
Sep 23 10:34:26 hermit sh[8390]: Cookie登录成功。Sep 23 10:34:26 hermit sh[8390]: WebDAV 服务器运行中。按下 x 退出,按下 c 进入设置。Sep 23 10:34:26 hermit sh[8390]: 监听地址:http://127.0.0.1:65472/
再报告一个不影响使用的小 bug,
-c config.yml
和-no-interactive
顺序不同时可能会导致配置文件失效,具体表现为监听地址是默认监听地址。
(偷懒被发现了🤣
(之后我用第三方库来处理命令行参数,就能解决问题
哈哈哈,辛苦啦