目标:在 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 命令时,我收到“命令未找到”
- 我怎样才能把它作为一个工作命令?
- 我需要在脚本中进行哪些更改才能使其保持事件状态,以便稍后能够将此类命令传递给它?
最佳答案
服务响应除从预定义集中提取的服务管理命令之外的交互式命令是不典型的。如果这就是您想要证明的概念,那么我建议您选择不同的方向。
但如果您必须这样做,那么您还有可行的替代方案:
对于开/关切换,请考虑在服务脚本中设置信号处理程序,例如
SIGUSR1
。您可以直接通过kill
命令发送信号,但我建议为此目的提供一个单独的脚本。对于更复杂的指令或多于极少量的不同指令,您需要某种通信 channel 。该脚本可能会使用 FIFO 或套接字来实现此目的,在这种情况下,我再次建议使用单独的脚本来发送命令。但这将要求您的服务显着更加复杂。
无论如何,请注意,尽管服务控制脚本有着悠久的传统,但服务实现本身很少是脚本。它们通常是编译后的程序,通常用 C 语言编写,因为这提供了对系统更直接的访问和更精细的控制,并且许多人还认为更安全(如果做得好的话)。
关于linux - 如何使用 bash/terminal 将命令传递给自定义 Linux 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58146958/