Tôi đã viết hai tập lệnh shell a.sh và b.sh. Trong a.sh và b.sh tôi có một vòng lặp vô hạn và chúng in ra một số đầu ra cho thiết bị đầu cuối. Tôi muốn viết một kịch bản khác gọi cả a.sh và b.sh nhưng tôi muốn người dùng lấy lại quyền kiểm soát của thiết bị đầu cuối ngay lập tức, thay vì chạy tập lệnh vô hạn và tôi muốn ẩn đầu ra trong thiết bị đầu cuối.Cách chạy tập lệnh shell trong nền và không có đầu ra
Trả lời
Sử dụng nohup
nế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ỉ cần sử dụng SecureCRT hoặc một cái gì đó như nó đăng nhập máy chủ.
Chuyển hướng stdout và stderr-/dev/null
để bỏ qua các đầu ra.
nohup /path/to/your/script.sh > /dev/null 2>&1 &
Nếu họ đang ở trong cùng thư mục với kịch bản của bạn có chứa:
./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &
Các &
ở cuối 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>&1
không cần thiết - nó chuyển hướng các luồng stdout và stderr, do đó bạn không cần phải xem chúng trên thiết bị đầu cuối, bạn có thể muốn thực hiện các tập lệnh ồn ào với nhiều đầu ra.
cảm ơn mọi cơ thể. tất cả các câu trả lời đều hữu ích thực sự cảm ơn. –
Chuyển hướng đầu ra vào một tập tin như thế này:
./a.sh > somefile 2>&1 &
này sẽ chuyển hướng cả stdout và stderr đến cùng một tập tin. Nếu bạn muốn chuyển hướng stdout và stderr đến hai tập tin khác nhau sử dụng này:
./a.sh > stdoutfile 2> stderrfile &
Bạn có thể sử dụng /dev/null
như một hoặc cả hai của các tập tin nếu bạn không quan tâm đến stdout và/hoặc stderr.
Xem bash manpage để biết chi tiết về chuyển hướng.
Xin lỗi này là hơi muộn nhưng không tìm thấy giải pháp lý tưởng cho các lệnh somple mà bạn không muốn bất kỳ tiêu chuẩn hoặc lỗi đầu ra (tín dụng nơi đó là do: http://felixmilea.com/2014/12/running-bash-commands-background-properly/)
này chuyển hướng đầu ra để null và giữ màn hình rõ ràng:
command &>/dev/null &
Lưu ý: lệnh sẽ bị chấm dứt khi thiết bị đầu cuối đã đóng. – Banana
Đối với bất cứ ai nhìn vào điều này trong tương lai ai muốn một giải pháp để giữ cho các lệnh chạy sau khi một phiên kết thúc, tôi sẽ đề nghị màn hình hoặc tmux. Họ cần thiết chạy một 'phiên trong một phiên' mà mang về sau khi bạn đóng phiên ban đầu. 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 bản sao lưu rsync ví dụ nơi đồng bộ hóa cần chạy trong một thời gian dài và bạn không muốn rời khỏi phiên chạy của mình. – DanteAlighieri
Chỉ cần thêm, đôi khi có đối số cho các tập lệnh sau đó lệnh trên sẽ trả về ** Chuyển hướng đầu ra mơ hồ **. – sabertooth1990
Cách tốt hơn tôi tìm thấy là sử dụng 'nohup /path/to/your/script.sh parameter1> & 1 &' Nếu có ai biết cách tốt hơn. – sabertooth1990
Bạn không cần '/ dev/null 2> & 1' nếu bạn đang sử dụng' nohup' vì nó đã thêm tất cả các luồng STDOUT và STDERR vào tệp nohup.out một cách tự động. Chỉ sử dụng: 'nohup/path/to/your/command &' – leonarth