【发布时间】:2019-09-28 13:50:40
【问题描述】:
目标:在 linux 中将自定义 bash 脚本作为服务运行,并允许我将命令传递给它,就像您可以通过终端/bash 传递给大多数其他服务一样。
我已经设置并测试了一个脚本,它可以做我需要它做的事情,但我不知道如何能够像其他服务一样向它传递命令。
示例: nano 打开 nano 编辑器以读取指定文件。
我想执行“fan on”,这将调用新服务“fan”并执行“on”命令。
奖励:能够将变量保存到配置文件中以供以后修改。但是现在,我在脚本顶部设置了变量,所以它不是完全必要的。
当前单元文件:
[Unit]
Description=Fan control Service
[Service]
Type=simple
Restart=always
RestartSec=30
ExecStart=/home/pi/Documents/FanControl.sh
User=pi
[Install]
WantedBy=multi-user.target
脚本:
#!/bin/bash
#########################################################
# User Settings
#GPIO Pin Number to use to control fan transistor.
fanpin=3
#Celsius temp to turn fan on/off
offtemp=55
ontemp=60
#Turn on the looping script automatically or not
autostart=TRUE
#Determine how often to scan temp and turn fan on/off if in auto
sleepinterval=10
#########################################################
#Misc Variables used in script - Leave these alone - Base Settings
MaxTemp=0
FanState=OFF
mode=MANUAL
auto=FALSE
#########################################################
# Functions Described Below
#########################################################
before-start() {
# Check if gpio is already exported
if [ ! -d /sys/class/gpio/gpio$fanpin ]
then
#Export the Pin
echo $fanpin > /sys/class/gpio/export
sleep 1 ;# Short delay while GPIO permissions are set up
echo Fan Pin Exported Successfully.
# Setup the pin as an output
sudo echo "out" > /sys/class/gpio/gpio$fanpin/direction
fi
}
#Function to turn fan on
on() {
# Sets FanPin to high
echo "1" > /sys/class/gpio/gpio$fanpin/value
FanState=ON
mode=Manual
auto=FALSE
echo Fan Turned on -- Mode set to Manual.
echo
}
#Function to turn fan off
off() {
# Sets FanPin to low
echo "0" > /sys/class/gpio/gpio$fanpin/value
FanState=OFF
mode=Manual
auto=FALSE
echo Fan Turned off -- Mode set to Manual.
echo
}
#Function to set the variables to values
#Haven't actually tested this function yet
Set() {
if $2 = "ontemp"
then
ontemp=$2
else
$2=$3
fi
}
#########################################################
# Begin Service Execution Code
#########################################################
#Don't know whow to write this section to keep it running as a service
#But it works well for testing purposes
before-start
on
sleep 3
off
echo
read -p "Select an action": Q
$Q
echo
action="$1"
serviceName="Fan-Control Service"
echo Exiting Fan Service
我可以使用 systemctl daemon-reload 它可以加载服务。 我可以使用'systemctl start fan'并且服务成功启动而没有错误。它还会让风扇运转几秒钟,所以我知道它的启动很好。
当尝试使用 'fan on' 作为 bash 命令时,我得到“找不到命令”
- 我怎样才能把它作为一个工作命令?
- 我需要在脚本中进行哪些更改以使其保持活动状态以便以后能够将此类命令传递给它?
【问题讨论】:
-
我不太明白。您有一个可以打开或关闭风扇的脚本,并且您想使用它来按需手动控制风扇。到目前为止一切都很好。但是为什么它需要是系统服务呢?看起来你正在寻找的是一个普通的命令。
-
它并不需要成为一项服务,但这对我来说更像是一个概念验证,而我正在尝试我想要尝试做的其他项目。另外,我希望它在系统启动时自动启动,我知道我可以通过脚本上的 cron-job 来完成。这是我学习进出的概念验证。我发现关于如何在 linux 中设置单元文件和服务的信息很少/不一致/不完整。我的最终目标是拥有一个充当 vpn-kill 开关的服务,该开关查看“nordvpn status”命令并在断开连接时终止某些应用程序,并在连接后重新启动。
-
@JohnBollinger 顺便说一句,谢谢你的提示。在谷歌搜索之后,我找到了该脚本的放置位置并将其作为我想要的自定义命令。这样就解决了我的问题,但我仍然对如何运行自定义服务感到好奇。感谢您的提示。
-
好的,那么现在的问题是如何普遍地实现您自己的系统服务,还是仍然是支持交互式命令的服务?
-
支持交互式命令的服务将是理想的。这样我就可以执行“风扇状态”并让它读出当前状态。将其作为一次性命令运行将重新初始化顶部的变量,然后报告这些变量,而不是最后设置的变量。不过,我认为将状态读/写到配置文件可以解决这个问题,而不是将其放在内存中。
标签: linux bash service raspberry-pi raspbian