Khi tôi chạy `./command.sh &`, tác vụ nền bị treo. Làm thế nào tôi có thể giữ cho nó chạy?


9

Đây là những gì tôi đang chạy:

alexandma@ALEXANDMA-1-MBP ./command.sh &
[2] 30374
alexandma@ALEXANDMA-1-MBP
[2]  + suspended (tty output)  ./command.sh

Tôi không muốn nó bắt đầu bị treo, tôi muốn nó tiếp tục chạy trong nền. Tôi sẽ chạy một loạt những thứ này trong một vòng lặp, vì vậy tôi cần một cái gì đó sẽ hoạt động theo cách đó.

Làm thế nào tôi có thể giữ cho nó chạy?


bạn có thể sử dụng cron, bạn sẽ chạy sau một khoảng thời gian
Hackaholic

Tôi giả sử bạn có nghĩa là cron. Làm thế nào điều đó sẽ được thực hiện để giải quyết vấn đề này?
Matt Alexander

Tôi đã giải thích một lần ở đây cách sử dụng màn hình cho công việc: serverfault.com/questions/466129/restore-ssh-session/ trộm
Valentin Bajrami

Nếu bạn không quan tâm đến stdoutstderrbạn chỉ có thể chuyển hướng họ /dev/nullthích./cmd.sh &> /dev/null &
111 ---

Câu trả lời:


7

Nó dừng lại vì lý do được đưa ra: nó cố gắng xuất ra tty. Bạn có thể cố gắng chuyển hướng đầu ra nếu ./command.shhỗ trợ điều đó hoặc chạy lệnh trong một tmuxhoặc screencửa sổ của chính nó. Ví dụ

 tmux new-window -n "window name" ./command.sh

và sau đó xem danh sách các cửa sổ được tạo tmux list-windowsvà đính kèm tmuxvới tmux attach.

Bằng cách đó, chương trình vẫn sẽ đợi đầu vào / đầu ra xảy ra, nhưng bạn có thể dễ dàng cung cấp đầu vào một khi bạn đi đến cửa sổ thích hợp và đầu ra sẽ chỉ được ghi lại mà không có bất kỳ hoạt động nào.


Đừng quênnohup
Sukima

Khi sử dụng tmuxkhông cần thiết
Anthon

Bạn đã trả lời câu hỏi của tôi với "Nó dừng lại vì lý do được đưa ra: nó cố gắng xuất ra tty. Bạn có thể cố gắng chuyển hướng đầu ra nếu ./command.sh hỗ trợ điều đó"
Matt Alexander

@MattAlexander bình luận của bạn có vẻ không đầy đủ
Anthon

11

Thêm một chi tiết vào lời giải thích của Anthon:

Không phải lúc nào quá trình viết nền cũng bị dừng lại. Điều này phụ thuộc vào cài đặt thiết bị đầu cuối tostop.

stty tostop
stty -tostop

có thể được sử dụng để chuyển đổi cài đặt này. Vì vậy, nếu bạn muốn có một quá trình nền để ghi vào "của quá trình khác" thiết bị đầu cuối sau đó bạn có thể giữ cho nó chạy nhưng không cần thiết tmux, screenhoặc tương đương.


5

Cách dễ nhất để làm điều này là thực thi lệnh như sau:

 nohup ./command.sh </dev/null &

Tôi bao gồm nohup trong trường hợp bạn đang sử dụng biến SH (không phải biến CSH) và sẽ chấm dứt phiên của bạn.


Điều này hoạt động trong Zsh, không giống như sttygiải pháp .
Melebius

@Melebius Bạn có thể giải thích tại sao sttykhông hoạt động zsh?
Barmar

@Barmar Thật không may. Tôi không biết gì thêm về mối quan hệ giữa sttyvà vỏ. Tôi chỉ thử hai giải pháp này và nohuplàm việc cho tôi.
Melebius


2

Cài đặt screen.

Khi bạn đã cài đặt màn hình. Chạy nó: # screen (bạn sẽ có một màn hình chào mừng khi bạn khởi động nó lần đầu tiên) Chạy lệnh của bạn:command.sh

Nhấn Ctrl+ arồi d.

Nó sẽ tách màn hình được khởi chạy trên máy chủ và giữ cho lệnh của bạn chạy.

Để quay lại màn hình này, gõ:

screen -r


0

Bạn có thể gặp lỗi này nếu shell của bạn là zsh và tập lệnh đang gọi sudovà bạn không có thông tin xác thực được lưu trong bộ nhớ cache hợp lệ (trước đây bạn không chạy sudo hoặc thông tin đăng nhập trước đó đã hết hạn) hoặc subạn phải nhập mật khẩu.

Nếu bạn không cần giữ đầu ra như các câu trả lời khác đã đề cập (như chạy tập lệnh của bạn mà không có &trong tmux hoặc màn hình), đây là một số giải pháp khả thi cho việc này:

  • vô hiệu hóa tty_ticketshoặc đặt timestamp_typeđể globaltrong file sudoers của bạn (vì vậy mà bạn không cần phải nhập mật khẩu của bạn trong tất cả các thiết bị đầu cuối) và / hoặc tăng giá trị của timestamp_timeout(điều này có một số vấn đề bảo mật nghiêm trọng).
  • chạy một lệnh đơn giản với sudotrước khi chạy tập lệnh để sudo sẽ có thông tin đăng nhập được lưu trong bộ nhớ cache khi gặp tập lệnh của bạn.
  • thay đổi tập lệnh của bạn để nó không gọi sudo hoặc su.
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.