【问题标题】:How to Pass commands to custom linux Service using bash / terminal如何使用 bash / 终端将命令传递给自定义 linux 服务
【发布时间】: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


【解决方案1】:

服务响应交互式命令是非典型的,而不是从预定义集合中提取的服务管理命令。如果这是您要证明的概念,那么我建议您选择不同的方向。

但如果你必须这样做,那么你有可行的选择:

  • 对于开/关切换,请考虑在服务脚本中设置信号处理程序,例如SIGUSR1。您可以通过kill 命令直接发送信号,但我建议您为此提供一个单独的脚本。

  • 对于更复杂的指令或非常少量的不同指令,您需要某种通信通道。该脚本可能会为此使用 FIFO 或套接字,在这种情况下,我会再次推荐一个单独的脚本来发送命令。但这将要求您的服务大大更加复杂。

无论如何,请注意,尽管服务-控制脚本的传统由来已久,但服务实现本身很少是脚本。它们通常是经过编译的程序,通常用 C 编写,因为这提供了对系统的更直接访问和更精细的控制,并且也被许多人认为更安全(如果做得好的话)。

【讨论】:

  • 感谢您的信息。在这个回复和其他用户对话促进了一些额外的研究之后,我想我可以用一个放在 /use/bin 中的简单脚本来做我想做的事。我已经修改了我的代码以查看一个配置文件,如果它被调用,我将寻找分叉出循环。这样脚本可以修改配置文件,循环将查看配置,看看我是否要求它停止或调整操作。我将添加一个 cron 作业以在系统启动时启动循环,之后一切都会好起来的。谢谢
  • 我的想法是在设置 deluge 之后产生的,它有一个如何使其成为服务广告的方法,希望在 nordvpn 断开连接时退出该服务。但是在后台运行的脚本就足够了。我只是在从脚本中杀死/启动洪水时遇到了麻烦。但经过这次实验后,我想我对脚本编写有了更多的了解,并且可能能够完成它。
猜你喜欢
  • 2011-04-01
  • 2018-09-19
  • 2018-02-13
  • 2021-03-31
  • 1970-01-01
  • 2023-04-05
  • 2016-06-07
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多