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ố:
- 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.
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.
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.
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.
ssh hostB scriptname filename hostC
và kịch bản gọissh 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ướcssh "$SLAVE_HOST" …
lệnh - nhưng của bạnset -x
đầu ra chẩn đoán cho thấytail
saussh
. 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ì