gpt4 book ai didi

linux - Shell脚本问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:02 28 4
gpt4 key购买 nike

我正在编写一个 shell 脚本,使我开发的应用程序在 Linux 上作为服务运行。当我使用 ./smpp-daemon.sh start 时,我编写的 shell 脚本完美运行。但是,当我想使用以下语法时:sh smpp-daemon.sh start 我收到以下错误:/srv/smpp/bin/smpp-daemon.sh: 26:/srv/smpp/bin/smpp-daemon.sh: 函数:未找到/srv/smpp/bin/smpp-daemon.sh: 27: local: 不在函数中。

这是 shell 脚本:

#!/bin/bash
#
# Unity SMPP Daemon script
#
# Arsene Tochemey GANDOTE

# Set this to your Java installation
JAVA_HOME=/usr/lib/jvm/java-7-oracle

appNameLo="smpp" # application name with the first letter in lowercase
appName="SMPP" # application name
osUser="root" # OS user name for the service
osGroup="root" # OS group name for the service
appHome="/srv/$appNameLo" # home directory of the service application
osUserHome="/$osUser" # home directory of the service user
appLogFile="/var/log/$appNameLo.log" # log file for StdOut/StdErr
maxShutdownTime=15 # maximum number of seconds to wait for the daemon to terminate normally
pidFile="/var/run/$appNameLo.pid" # name of PID file (PID = process ID number)
javaCommand="java" # name of the Java launcher without the path
javaExe="$JAVA_HOME/bin/$javaCommand" # file name of the Java application launcher executable
javaArgs="-jar $appHome/smsgh-smpp.jar" # arguments for Java launcher
javaCommandLine="$javaExe $javaArgs" # command line to start the Java service application
javaCommandLineKeyword="smsgh-smpp.jar" # a keyword that occurs on the command line, used to detect an already running service process and to distinguish it from others

# Makes the file $1 writable by the group $osGroup.
function makeFileWritable {
local filename="$1"
touch $filename || return 1
chgrp $osGroup $filename || return 1
chmod g+w $filename || return 1
return 0;
}

# Returns 0 if the process with PID $1 is running.
function checkProcessIsRunning {
local pid="$1"
if [ -z "$pid" -o "$pid" == " " ]; then return 1; fi
if [ ! -e /proc/$pid ]; then return 1; fi
return 0;
}

# Returns 0 if the process with PID $1 is our Java service process.
function checkProcessIsOurService {
local pid="$1"
if [ "$(ps -p $pid --no-headers -o comm)" != "$javaCommand" ]; then return 1; fi
grep -q --binary -F "$javaCommandLineKeyword" /proc/$pid/cmdline
if [ $? -ne 0 ]; then return 1; fi
return 0;
}

# Returns 0 when the service is running and sets the variable $pid to the PID.
function getServicePID {
if [ ! -f $pidFile ]; then return 1; fi
pid="$(<$pidFile)"
checkProcessIsRunning $pid || return 1
checkProcessIsOurService $pid || return 1
return 0;
}

function startServiceProcess {
cd $appHome || return 1
rm -f $pidFile
makeFileWritable $pidFile || return 1
makeFileWritable $appLogFile || return 1
cmd="nohup $javaCommandLine >>$appLogFile 2>&1 & echo \$! >$pidFile"
su -m $osUser -s $SHELL -c "$cmd" || return 1
sleep 0.1
pid="$(<$pidFile)"
if checkProcessIsRunning $pid; then :; else
echo -ne "\n$appName start failed, see logfile."
return 1
fi
return 0;
}

function stopServiceProcess {
kill $pid || return 1
for ((i=0; i<maxShutdownTime*10; i++)); do
checkProcessIsRunning $pid
if [ $? -ne 0 ]; then
rm -f $pidFile
return 0
fi
sleep 0.1
done
echo -e "\n$appName did not terminate within $maxShutdownTime seconds, sending SIGKILL..."
kill -s KILL $pid || return 1
local killWaitTime=15
for ((i=0; i<killWaitTime*10; i++)); do
checkProcessIsRunning $pid
if [ $? -ne 0 ]; then
rm -f $pidFile
return 0
fi
sleep 0.1
done
echo "Error: $appName could not be stopped within $maxShutdownTime+$killWaitTime seconds!"
return 1;
}

function startService {
getServicePID
if [ $? -eq 0 ]; then echo -n "$appName is already running"; RETVAL=0; return 0; fi
echo -n "Starting $appName "
startServiceProcess
if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
echo "started PID=$pid"
RETVAL=0
return 0;
}

function stopService {
getServicePID
if [ $? -ne 0 ]; then echo -n "$appName is not running"; RETVAL=0; echo ""; return 0; fi
echo -n "Stopping $appName "
stopServiceProcess
if [ $? -ne 0 ]; then RETVAL=1; echo "failed"; return 1; fi
echo "stopped PID=$pid"
RETVAL=0
return 0;
}

function checkServiceStatus {
echo -n "Checking for $appName: "
if getServicePID; then
echo "running PID=$pid"
RETVAL=0
else
echo "stopped"
RETVAL=3
fi
return 0;
}

function main {
RETVAL=0
case "$1" in
start) # starts the Java program as a Linux service
startService
;;
stop) # stops the Java program service
stopService
;;
restart) # stops and restarts the service
stopService && startService
;;
status) # displays the service status
checkServiceStatus
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac
exit $RETVAL
}

main $1

请协助,因为我不是 shell 脚本极客。我只能绕着走。

最佳答案

问题是双重的:

  1. Bash 在 Debian、Ubuntu 等平台上不是 sh,因此当您使用 sh 执行脚本时,Bashishms 将无法工作。 Debian 使用 dash 代替 sh
  2. local 关键字实际上不是标准的 POSIX sh。 Dash 认为这是一个函数调用。

简单的解决方法:不要使用 local,确保您的变量名是唯一的。 Sh 脚本不是我的强项,但据我所知,在你的情况下,只需删除有问题的 local 关键字就可以了。

关于linux - Shell脚本问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16033004/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com