2008-08-27 45 views
9

Tôi đang tìm một cách để chuyển hướng tất cả các luồng stderr trong bash tương tác (lý tưởng cho quá trình cha mẹ gọi của nó).Làm thế nào để chuyển hướng tất cả các stderr trong bash?

Tôi không muốn chuyển hướng luồng stderr từ từng lệnh riêng lẻ, mà tôi có thể thực hiện bằng cách thêm 2> a_file vào mỗi lệnh.

Theo mặc định, các luồng stderr này được chuyển hướng đến stdout của một bash tương tác. Tôi muốn nhận được chúng trên stderr của quá trình bash tương tác này để ngăn chặn stdout của tôi bị ô nhiễm bởi các thông báo lỗi và có thể xử lý chúng tách biệt.

Bất kỳ ý tưởng nào?

Tôi vẫn chưa tìm thấy câu trả lời ... Nhưng có thể đây thực sự là thông số tty. Có ai biết điều gì đó về trách nhiệm vỏ tty/tương tác để xử lý stderr?

+0

bạn đề cập đến python trong một chú thích, bạn có thể hiển thị những gì mã bạn đang sử dụng để tạo các luồng SSH này. Bạn không sử dụng popen/popen2/popen3? – jtimberman

Trả lời

4

Bạn có thể khởi động một quá trình bash mới chuyển hướng stderr của quá trình đó:

$ bash -i 2> stderr.log 
    $ 
7

Sử dụng exec BUILTIN trong bash:

exec 2> /tmp/myfile

2

Hãy thử lệnh của bạn trong doublequotes, như vậy:

ssh remotehost "command" 2>~/stderr 

Đã kiểm tra trên hệ thống cục bộ của tôi bằng cách sử dụng tệp không tồn tại trên máy chủ từ xa.

$ ssh remotehost "tail x;head x" 2>~/stderr 
$ cat stderr 
tail: cannot open `x' for reading: No such file or directory 
head: cannot open `x' for reading: No such file or directory 
+0

Nếu bạn gõ lệnh trực tiếp sau ssh, bạn không tải một trình bao trên máy chủ từ xa. Lệnh được thực hiện trực tiếp thông qua kênh ssh. Tôi đang sử dụng paramiko trong python nhưng điều này là như nhau. Vấn đề của tôi là tôi cần một trình bao tương tác để thực hiện nhiều lệnh và vẫn bị lỗi. –

2

Tôi không thấy vấn đề của bạn nó hoạt động như thiết kế:

$ ssh remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout 
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found 
0

Cố gắng ssh -t để tạo ra một pseudo-TTY vào cuối từ xa?

2

Hai điều:

  1. Sử dụng 2>&1 trong một từ xa kết quả lệnh ssh vào sự sai lạc kết thúc bên trong tarfile địa phương, kết quả là một bản sao lưu 'xuống cấp'.
  2. Nếu bạn muốn áp dụng chuyển hướng ở phía bên kia của ssh, hãy nhớ thoát khỏi lệnh chuyển hướng.

Đề xuất của tôi sẽ chuyển hướng stderr ở phía bên kia vào một tệp và nhận nó sau này, trong trường hợp có lỗi.

dụ:

ssh -t remotehost tar -cf - /mnt/backup 2\>backup.err > localbackup.tar 
EXITSTATUS=$? 
if [ $EXITSTATUS != "0" ] then 
    echo Error occurred! 
    ssh remotehost cat backup.err >localbackup.errors 
    cat localbackup.errors 
    ssh remotehost rm backup.err 
else 
    echo Backup completed successfully! 
    ssh remotehost rm backup.err 
fi 
2

tôi tìm ra cách tốt nhất là xung quanh các lệnh bằng dấu ngoặc đơn, '()', (khởi động một sub-shell) hoặc xoăn-niềng răng, '{}' (không phụ -shell; nhanh hơn):

{ 
    cmd1 
    cmd2 
    ... 
    cmdN 
} 2> error.log 

Tất nhiên, điều này có thể được thực hiện trên 1 dòng:

{ cmd1; cmd2; ... cmdN; } 2> error.log 
Các vấn đề liên quan