2013-03-14 52 views
6

Tôi đang cố tạo mẫu cho các tập lệnh của các dịch vụ startstop. Tôi đã kiểm tra mẫu để bắt đầu và dừng tomcat và xem lệnh RETVAL=$?.RETVAL có nghĩa là gì?

Điều này làm gì? Tôi có nên giữ nó không? Nhân tiện, kịch bản của tôi ở dưới đây trong trường hợp các bạn muốn xem nó.

#!/bin/bash 
#=================================================================================== 
# 
# 
FILE: <script-file-name>.sh 
# 
# 
USAGE: <script-file-name>.sh [-d] [-l] [-oD logfile] [-h] [starting directories] 
# 
# DESCRIPTION: List and/or delete all stale links in directory trees. 
# 
The default starting directory is the current directory. 
# 
Don’t descend directories on other filesystems. 
# 
# 
OPTIONS: see function ’usage’ below 
# REQUIREMENTS: --- 
# 
BUGS: --- 
# 
NOTES: --- 
# 
AUTHOR: Valter Henrique, [email protected]<company>.com 
# 
COMPANY: <company> 
# 
VERSION: 1.0 
# 
CREATED: 03.14.13 
# 
REVISION: 03.14.13 
#=================================================================================== 
# 
# chkconfig: 345 90 12 
# description: <service-name> start, stop, restart service 
# 
# Get function from functions library 
. /etc/init.d/functions 

folder=/<company>/<service-folder> #folder to the application 
service="<service-name>" #name of the service 

startup=$folder/start.sh 
shutdown=$folder/stop.sh 


#=== FUNCTION ================================================================ 
# 
NAME: start 
# DESCRIPTION: Start the service <service-name> 
# PARAMETER 1: --- 
#=============================================================================== 
start() { 

    #---------------------------------------------------------------------- 
    # logging the start 
    #---------------------------------------------------------------------- 
    initlog -c "echo -n Starting $service:" 

    #---------------------------------------------------------------------- 
    # getting the process PID 
    #----------------------------------------------------------------------  
    pid_process=`ps -ef | grep "$folder/<jar>.jar" | grep -v grep |awk -F' ' '{ print $2 }'`; 

    if [ $pid_process ]; then 
    echo "<service-name> is running!" 
    echo "Stop then first!" 
    else 
    action $"Starting <service-name> service: " su - <user_deployer> -c $startup 
    RETVAL=$? 
    fi 
    #---------------------------------------------------------------------- 
    # create the lock file 
    #---------------------------------------------------------------------- 
    touch /var/lock/subsys/$service 
    success $"Sucess $service startup" 
    echo 
} 

#=== FUNCTION ================================================================ 
# 
NAME: stop 
# DESCRIPTION: Stop the service <service-name> 
# PARAMETER 1: --- 
#=============================================================================== 
stop() { 
    #---------------------------------------------------------------------- 
    # logging the stop 
    #---------------------------------------------------------------------- 
    initlog -c "echo -n Stopping $service: " 
    killproc $service 
    #---------------------------------------------------------------------- 
    # now, delete the lock file 
    #---------------------------------------------------------------------- 
    rm -f /var/lock/subsys/$service 
    echo 
} 

#---------------------------------------------------------------------- 
# Main Logic 
#---------------------------------------------------------------------- 
case "$1" in 
    start) 
     start 
     ;; 
    stop) 
     stop 
     ;; 
    status) 
     status $service 
     ;; 
    restart|reload|condrestart) 
     stop 
     start 
     ;; 
    *) 
     echo $"Usage: $0 {start|stop|restart|reload|status}" 
     exit 1 
esac 
exit 0 
+1

Vì không ai khác đã đề cập đến nó, 'RETVAL' là viết tắt của' RETurn VALue'. Biết từ nguyên của từ khóa * nix là điều giúp tôi nhớ chúng. – NobleUplift

Trả lời

19

$? cho biết trạng thái của lệnh cuối cùng được thực thi. Trong trường hợp của bạn, lệnh cuối cùng được thực thi là action..... Trạng thái thoát của lệnh này sẽ có mặt trong $? mà sau này được ghi lại trong biến số RETVAL. Nếu lệnh thành công, $? sẽ chứa 0, nếu không giá trị khác 0.

+2

Một điều cần nhấn mạnh: '$?' Được ghi đè sau mỗi lệnh, vì vậy nếu bạn muốn ghi nhớ trạng thái cho một lệnh cụ thể, bạn cần gán giá trị của nó cho biến khác (như 'RETVAL') ngay sau khi lệnh hoàn tất. – chepner

3

RETVAL là một biến. $? đang gán trạng thái của lệnh được thực thi cuối cùng cho biến RETVAL.

2

Như những người khác đã nêu, $? là trạng thái thoát của lệnh cuối cùng.

Bây giờ, về câu hỏi của bạn ...

RETVAL không được sử dụng bất cứ nơi nào khác trong một kịch bản, nhưng hãy nhớ, trong bash, các biến thông thường là toàn cầu để họ có thể được sử dụng bởi các chức năng khác. Như bạn thấy, có một cuộc gọi success có thể sử dụng nó. Trong phân phối Tôi đã kiểm tra/etc/init.d/functions không sử dụng biến này, do đó, dòng chỉ là tiếng ồn và có thể bị xóa .. hãy kiểm tra phân phối của bạn để xem nó hoạt động như thế nào.