lệnh nohup đuôi với chuyển hướng trong tập lệnh shell không được gọi đúng trong một tình huống cụ thể


-2

Tôi có một vấn đề trong đó một lệnh tail trong bash script không hoạt động chính xác khi được gọi từ xa bằng cách chỉ cung cấp 1 param trong số 2 params. Nhưng nó hoạt động chính xác nếu:

  • thực hiện trực tiếp trên địa phương với 1 param
  • thực hiện trực tiếp trên địa phương với 2 param
  • thực hiện từ xa với 2 params

Tôi đã viết kịch bản dưới đây mà bắt đầu theo đuôi. Phải mất 2 tham số:

  1. TESTNAME: Thông số này là bắt buộc. Đây là tên của trường hợp thử nghiệm. Nó tạo ra một tệp nhật ký với tên này.
  2. SLAVE_HOST: Thông số này là tùy chọn. Nếu được cung cấp, nó sẽ ssh đến máy chủ nô lệ được cung cấp và bắt đầu một tập lệnh tương tự trên nó.

    #!/bin/bash
    TESTNAME="$1"
    
    testdate=$(date +'%m_%d_%Y')
    REG_DIR=/opt/reg-test-results/REG_"$testdate"
    
    #create regression results directory if it does not exist
    mkdir -p "$REG_DIR"
    
    FILENAME="$REG_DIR"/"$TESTNAME"
    
    #if file already exists, create a new one with current time stamp appended to name
    if [ -f "$FILENAME" ]; then
           TIME=$(date +'%m_%d_%Y-%H.%M.%S')
           FILENAME="$FILENAME"_"$TIME"
    fi
    
    echo "$FILENAME" > /opt/reg-test-results/currentTestName
    
    #start tailing
    nohup tail -f -n0 /path/to/log/files/*/*server.log > "$FILENAME" &
    echo "$!" > $REG_DIR/reg_tail.pid
    
    #if slave host is provided, start tailing logs on slave also
    if [ "$#" -gt 1 ]; then
           SLAVE_HOST="$2"
           ssh "$SLAVE_HOST" /path/to/script/startTailLogTestCaseSlave.sh "$FILENAME"
    fi
    

Một vài dòng mã đầu tiên lưu tham số trong các biến, tạo cấu trúc thư mục và tên tệp cho tệp nhật ký nơi nhật ký đuôi sẽ được hướng dẫn. Sau đó, tôi có lệnh đuôi nohup để bắt đầu cắt các bản ghi và hướng đến tệp nhật ký. Đây là dòng mã không hoạt động đúng. Sau đó, nếu đối số thứ hai được cung cấp, nó sẽ ssh đến máy chủ đó và thực thi một lệnh trên nó.

Vấn đề: Khi chạy từ xa và vượt qua cả hai thông số, tôi thấy một quá trình đuôi chạy sau khi thực thi tập lệnh này và tôi thấy tệp nhật ký được điền đúng nội dung. Nhưng nếu tôi chỉ cung cấp thông số đầu tiên, thì có vẻ như nó bắt đầu đuôi và ngay lập tức dừng nó vì tôi thấy một id tiến trình mới trong tệp reg_tail.pid nhưng tệp nhật ký ($ FILENAME) không được tạo và không có quá trình đuôi nào đang chạy.

Kịch bản chạy hoàn hảo với 1 param hoặc cả hai khi được thực thi trực tiếp trên máy.

Bởi "Khi chạy từ xa", ý tôi là ssh vào máy và gọi tập lệnh. Ví dụ:

$ ssh -t user@host /path/to/script/script.sh testcasename.log

Nỗ lực gỡ lỗi:

Đây là những gì tôi thấy khi tôi sử dụng set -x và chạy từ máy từ xa:

Khi đối số thứ hai được thông qua và mọi thứ chạy bình thường, tôi thấy đuôi nohup được thực thi ở cuối.

  ....
  + echo 13441
  + '[' 2 -gt 1 ']'
  + SLAVE_HOST=slaveHost
  + ssh slaveHost /path/to/script/startTailLogTestCaseSlave.sh /opt/reg-test-   results/REG_09_11_2015/logs2.log
  + nohup tail -f -n0 /path/to/logs/../check-server.log ...
  nohup: redirecting stderr to stdout
  Connection to hostname closed.

Khi chỉ có đối số đầu tiên được thông qua, đuôi nohup không bao giờ được thực thi:

  ...
  + echo 13607
  + '[' 1 -gt 1 ']'
  Connection to hostname closed.

(1) Wow. Bạn đã đăng nhập vào hostA và bạn nhập ssh hostB scriptname filename hostC kịch bản gọi ssh hostC scriptname filename? Bạn có thể muốn lùi lại và xem liệu bạn có thể đơn giản hóa thiết kế của mình hay không. (2) Kịch bản hiển thị tail lệnh trước ssh "$SLAVE_HOST" … lệnh - nhưng của bạn set -x đầu ra chẩn đoán cho thấy tail sau ssh. Quan tâm để giải thích điều đó? (3) Bạn phải luôn trích dẫn các biến shell trừ khi bạn có lý do chính đáng để không và bạn chắc chắn rồi bạn biết bạn đang làm gì
Scott

Tại sao bạn cần nohup ở đây ở nơi đầu tiên? Tôi nghĩ rằng điều đó có thể gây rối với các mô tả tập tin đầu ra trong trường hợp này.
Breakthrough

Cảm ơn mọi người. @ Hủy bỏ, lưu ý # 1. Cảm ơn. Về # 2, đây là thứ tự tôi đang thấy. Tôi không biết lý do. Đuôi luôn luôn được thực hiện ở cuối khi tôi vượt qua trong đối số thứ hai. Tôi đã thử nhiều biến thể như truyền một chuỗi có giá trị "null" cho SLAVE_HOST và thêm điều kiện để không ssh cho chuỗi đó, nếu giá trị là "null". Nó chỉ bắt đầu đuôi khi lệnh ssh được thực thi và bắt đầu đuôi sau ssh, mặc dù lệnh đuôi nằm trước ssh. Về # 3, đã cập nhật mã của tôi để luôn sử dụng dấu ngoặc kép.
Neha Sharma

@BreakENC, loại bỏ nohup không giúp được gì.
Neha Sharma

@NehaSharma Tại sao bạn thêm nohup ở nơi đầu tiên? Giải thích có thể giúp gỡ lỗi vấn đề trong tay ở đây. Điều đó đang được nói, nếu bạn có hành vi tương tự mà không có nohup ở tất cả, sau đó không có gì để làm với vấn đề / câu hỏi cụ thể của bạn ở nơi đầu tiên.
Breakthrough

Câu trả lời:


0

Tôi đã giải quyết vấn đề bằng cách thêm một độ trễ sau lệnh đuôi.

nohup tail -f -n0 /path/to/log/files/*/*server.log > "$FILENAME" 2> test.err < /dev/null &
echo "$!" > "$REG_DIR"/reg_tail.pid

#without this delay, the above tail command is not being executed when only one 1 argumet is passed
sleep 1

#if slave host is provided, start tailing logs on slave also
if [ "$#" -gt 1 ]; then

Tôi đã tự hỏi tại sao nó hoạt động sau khi lệnh ssh được thực thi mặc dù nó không liên quan. Vì vậy, tôi quyết định thêm một sự chậm trễ. Mặc dù tôi không phải là chuyên gia, nhưng có vẻ như là một điều kiện chủng tộc. Quá trình nền đuôi đã được lên kế hoạch để chạy vào cuối và trong trường hợp không có lệnh ssh nào được thực thi, tập lệnh đã thoát và phiên kết thúc trước khi quá trình đuôi có thể có cơ hội chạy. Đưa quy trình chính vào chế độ ngủ sẽ tạo cơ hội cho quá trình (hoặc luồng) chạy. Cho rằng, tôi không chắc chắn rằng giải pháp này là tốt nhất. Nếu tôi sử dụng chờ thay vì ngủ, nó sẽ bị kẹt vì "tail -f" sẽ tiếp tục chạy. Tôi đang sử dụng tập lệnh này để theo dõi nhật ký và sau đó chạy một trường hợp thử nghiệm. Sau khi thực hiện trường hợp thử nghiệm hoàn thành, tôi đang chạy một đoạn script khác đọc phần đuôi của nó từ nơi nó được lưu trữ và giết đuôi. Xin vui lòng cho tôi biết nếu tôi nhầm lẫn trong sự hiểu biết của tôi và nếu có một giải pháp tốt hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.