Cách chạy tập lệnh shell trong nền và không nhận được đầu ra


111

Tôi đã viết hai kịch bản shell a.shb.sh. Trong a.shb.shtôi có vòng lặp for vô hạn và chúng in một số đầu ra cho thiết bị đầu cuối. Tôi muốn viết một tập lệnh khác gọi cả hai a.shb.shnhưng tôi muốn người dùng lấy lại quyền kiểm soát thiết bị đầu cuối ngay lập tức, thay vì để tập lệnh chạy vô hạn và tôi muốn ẩn đầu ra trong thiết bị đầu cuối.

Câu trả lời:


220

Sử dụng nohupnếu công việc nền của bạn mất nhiều thời gian để hoàn thành hoặc bạn chỉ sử dụng SecureCRT hoặc thứ gì đó tương tự để đăng nhập máy chủ.

Chuyển hướng stdoutthiết bị lỗi chuẩn để /dev/nullbỏ qua các đầu ra.

nohup /path/to/your/script.sh > /dev/null 2>&1 &

Chỉ cần thêm, đôi khi có đối số cho các tập lệnh thì lệnh trên sẽ trả về chuyển hướng đầu ra Mơ hồ .
sabertooth1990

Một cách tốt hơn mà tôi tìm thấy là sử dụng nohup /path/to/your/script.sh parameter1 > & 1 &Nếu ai biết một cách tốt hơn.
sabertooth1990

17
Bạn không cần /dev/null 2>&1nếu đang sử dụng nohupvì nó đã tự động nối tất cả các luồng STDOUT và STDERR vào tệp nohup.out. Chỉ sử dụng:nohup /path/to/your/command &
Leonardo

1
@ sabertooth1990 Dòng lệnh của bạn bị lỗi:-bash: syntax error near unexpected token '&'
Notes-jj

1
Sau đó, bạn sẽ giết quá trình đã tạo như thế nào?
Alexis_A

32

Chuyển hướng đầu ra đến một tệp như thế này:

./a.sh > somefile 2>&1 &

Thao tác này sẽ chuyển hướng cả stdout và stderr đến cùng một tệp. Nếu bạn muốn chuyển hướng stdout và stderr đến hai tệp khác nhau, hãy sử dụng điều này:

./a.sh > stdoutfile 2> stderrfile &

Bạn có thể sử dụng /dev/nulllàm một hoặc cả hai tệp nếu bạn không quan tâm đến stdout và / hoặc stderr.

Xem trang bash để biết chi tiết về chuyển hướng.


23

Xin lỗi vì điều này hơi muộn nhưng đã tìm thấy giải pháp lý tưởng cho các lệnh đơn giản mà bạn không muốn bất kỳ đầu ra tiêu chuẩn hoặc lỗi nào (tín dụng khi nó đến hạn: http://felixmilea.com/2014/12/running-bash-commands-background -properly / )

Điều này chuyển hướng đầu ra thành null và giữ cho màn hình rõ ràng:

command &>/dev/null &

2
Lưu ý: lệnh sẽ được kết thúc khi đóng thiết bị đầu cuối.
Banana

1
Đối với bất kỳ ai xem xét vấn đề này trong tương lai, những người muốn có giải pháp để giữ cho các lệnh chạy sau khi phiên kết thúc, tôi sẽ đề xuất screen hoặc tmux. Họ cần thiết chạy một 'phiên trong một phiên' tiếp tục sau khi bạn đóng phiên đầu tiên. Sau đó, bạn có thể kết nối lại với phiên đang diễn ra nếu bạn đăng nhập lại. Tuyệt vời để chạy sao lưu rsync, chẳng hạn như khi đồng bộ hóa cần chạy trong một thời gian dài và bạn không muốn để phiên của mình đang chạy.
DanteAlighieri

13

Nếu chúng nằm trong cùng thư mục với tập lệnh của bạn có chứa:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

Các &cuối cùng là những gì làm cho kịch bản của bạn chạy ở chế độ nền.

Phần > /dev/null 2>&1này không cần thiết - nó chuyển hướng các luồng stdout và stderr để bạn không phải nhìn thấy chúng trên thiết bị đầu cuối, điều mà bạn có thể muốn làm đối với các tập lệnh ồn ào với nhiều đầu ra.


7

Chạy trong một vỏ con để xóa thông báo và đóng STDOUT và STDERR:

(&>/dev/null script.sh &)

Đây là câu trả lời duy nhất cũng không in nhật ký công việc nền như [1] + 54765 done <emacs>cảm ơn bạn
alper

2

Nếu bạn muốn chạy script trong một khởi động linux, bạn phải chạy như dưới đây.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &


0

Những ví dụ này hoạt động tốt:

nohup sh prog.sh proglog.log 2> & 1 &

Vòng lặp for bạn có thể sử dụng như sau:

cho tôi trong {1..10}; làm sh prog.sh; ngủ 1; xong prog.log 2> & 1 &

Nó hoạt động trong nền và không hiển thị bất kỳ đầu ra nào.

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.