我制作了一个服务脚本,它在重新启动后运行脚本文件并在服务后启动[email protected]
。问题是我的脚本文件需要提供一些用户输入,但服务文件在串行控制台(MINICOM)上没有显示任何输出。
我想知道是否有一种方法可以获取在 minicom 窗口上运行脚本文件的服务文件的输出。服务文件正在运行,因为我可以看到运行命令时显示的输出
systemctl status transfer.service
我在下面附上了我的服务文件以供参考,
[Unit]
Description=My Script Service
[email protected]
[Service]
ExecStart=/home/PARTITION/flag.sh
[Install]
WantedBy=multi-user.target
答案1
通常[email protected]
是一个服务模板。模板定义的实际服务类似于[email protected]
,即符号后面的部分 @
将标识该服务将应用到的串行端口。
没有它,该服务就没有意义——尝试启动它只会导致错误:
# systemctl start [email protected]
Failed to start [email protected]: Unit name [email protected] is missing the instance name.
See system logs and 'systemctl status [email protected]' for details.
我不明白[email protected]
在这种情况下会有什么用处。
一般来说,像您这样的系统服务transfer.service
不从控制台获取输入。
可以将串行端口专用于特定服务,并允许它通过串行端口进行输入和输出,但只有当串行端口没有同时被其他任何东西使用时,这才真正有效。特别是这样的串口不应用作系统控制台或通过任何serial-getty@<port name>.service
.
所以,我对你的设置有点困惑。您的 MINICOM 显示屏当前是否login:
在串行端口上显示提示?如果是这样,您是否需要继续这样做?如果答案是肯定的,那么您无法使用该串行端口来处理您的输入和输出transfer.service
,因为您无法控制哪些输入将进入您的服务以及哪些输入将进入控制台提示。输入将转到最先读取它的进程,而这本质上是不可预测的。
如果串行端口当前未使用(即,即使您在 MINICOM 窗口中按 Enter 几次,也不会得到任何输出),您可以通过添加以下内容将您的服务连接到它:
StandardInput=tty
StandardOutput=tty
TTYPath=/dev/ttyS0 # or whatever is the actual device name for the serial port
到[Service]
您的文件的部分transfer.service
。这将在串行端口可用后立即启动脚本,并允许访问串行端口的任何人立即与脚本交互,而无需登录。
如果您希望/home/PARTITION/flag.sh
脚本在登录时以交互方式运行,有两种标准方法可以实现:
您可以将其添加到您的登录脚本中(通常
~/.bash_profile
是 或~/.profile
),或者,如果您想专用一个特定的用户帐户来运行该脚本而不做其他事情,您可以将脚本设置为是该用户的默认 shell,带有
sudo chsh -s /home/PARTITION/flag.sh username
.如果您这样做,脚本将在该用户登录时立即启动,一旦结束,他们将立即注销并返回到登录提示符。