rc.d 脚本默认给定一个“开始”参数?
Posted
技术标签:
【中文标题】rc.d 脚本默认给定一个“开始”参数?【英文标题】:rc.d script given a "start" argument by default? 【发布时间】:2018-10-14 23:32:45 【问题描述】:我的目标是制作一个 bash 脚本服务,它在运行级别为 5 时创建一个文件,并在运行级别为 3 时删除该文件。
我遇到的问题是当我到达运行级别 3 时。我明白了:
为什么它开始争论而我没有通过任何争论。 函数 start 用于创建文件,函数 stop 用于删除文件,它们工作正常 如果我删除参数数量的测试条件并让脚本在文件处于 lvl 3 时删除文件,我可以使脚本正常工作当前的 lvl 是:3,参数数量是:1 我在第 10 行 .命令是开始
但是它告诉我参数的数量是 1 并且它开始并没有进入我的脑海。我已经做了很多研究,但没有找到任何解决方案。
#! /bin/bash
# chkconfig: 35 99 01
# description : some startup script
#### Constants
FILE="/home/ayadi/Desktop/inittp"
CURRENT_LVL="$(runlevel | awk 'print $2')"
echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is $1"
#### Functions
start()
if ! [[ -f "$FILE" ]];
then
touch "$FILE"
echo "File Created..."
else
echo "File Does Exist..."
fi
stop()
if [[ -f "$FILE" ]];
then
rm "$FILE"
echo "File Deleted..."
else
echo "File Does Not Exist..."
fi
#### Main
if [ $# -eq 0 ]
then
echo "Entred the arguments -eq 0"
if [ "$CURRENT_LVL" == "5" ]
then
echo "Entred the if current lvl 5 statement"
start
fi
if [ "$CURRENT_LVL" == "3" ]
then
echo "Entred the if current lvl 3 statement"
stop
fi
else
case "$1" in
[sS][tT][aA][rR][tT])
if ! ([ -e "$FILE" ])
then
echo "I am the case statement.the command is $1"
start
fi
;;
[sS][tT][oO][pP])
if [ -e "$FILE" ]
then
stop
fi
;;
*)
echo "Please enter start or stop"
;;
esac
fi
【问题讨论】:
另外,! ([ -e "$FILE" ])
中的括号具有显着的性能成本(它们指示 shell 创建一个子进程并在其中运行测试)。取出它们更便宜:[ ! -e "$FILE" ]
或 ! [ -e "$FILE" ]
也可以。
至于问题本身,但我们无法仅使用您提供的内容来重现该问题。重要的不仅仅是脚本本身,还有它的调用方式。
(顺便说一句——在[ ]
中,唯一的POSIX 标准字符串比较运算符是=
,而不是==
;后者专门在bash 中工作,但它不可靠所有 POSIX 外壳)。
(...还有一个问题:全大写的变量名保留给对 shell 本身或其他 POSIX 指定的工具有意义的变量,而保证至少有一个小写字符的名称应用程序使用安全;参见pubs.opengroup.org/onlinepubs/9699919799/basedefs/…,第四段;遵循本指南可避免因无意中覆盖有意义的变量(如PATH
)而破坏您的外壳。
@CharlesDuffy 我正在制作 TEMPORARY="~" 因为我想稍后删除临时文件。对不起,我忘了删除它。
【参考方案1】:
调试建议,从此改变:
echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is $1"
到这里:
echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is \"$1\", the whole command line is \"$0 $@\""
这不会解决问题,但它会提供有关实际情况的更多信息。
#Main
可以简化。它不会解决任何问题,但它会让思考变得更容易:
#### Main
case "$1,," in
"") echo "Entered no arguments."
case "$CURRENT_LVL" in
3|5) echo "Entered the if current level $CURRENT_LVL statement" ;;&
5) start ;;
3) stop ;;
esac ;;
start) if ! [ -e "$FILE" ] ; then
echo "I am the case statement.the command is $1"
start
fi ;;
stop) [ -e "$FILE" ] && stop ;;
*) echo "Please enter start or stop" ;;
esac
注意bash
isms。 $1,,
以小写形式返回 $1
。 ;;&
下降到下一个 case
测试,而不是跳转到 ecase
。
【讨论】:
现在我得到:命令是“start”,整个命令是“/etc/rc3.d/S99TD2miniScript start” 知道如何让它运行停止功能而不是停止功能吗?【参考方案2】:默认情况下,当调用服务以在特定运行级别自动运行时,会为其分配“start”参数。
【讨论】:
以上是关于rc.d 脚本默认给定一个“开始”参数?的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu 16.04设置rc.local开机启动命令/脚本的方法(通过update-rc.d管理Ubuntu开机启动程序/服务)