Làm thế nào để thay đổi thư mục và tắt quá trình


0

Tôi biết cách thay đổi thư mục:

cd path

Tôi biết cách tách một quá trình:

command &, nohup command > /tmp/test_output.txt 2>&1 &, nohup command > /dev/null 2>&1 &, disown command &

đây là một tài liệu tham khảo tốt cho điều đó: Làm cách nào để tách toàn bộ quá trình khỏi Terminal?

Nhưng tôi không biết làm thế nào để làm cả hai cùng một lúc, điều này dường như là không thể. Ai giúp tôi với? Đây là một số điều tôi đã thử:

path/command
nohup cd path && command > /tmp/test_output.txt 2>&1 &
cd path && nohup command > /tmp/test_output.txt 2>&1 &
cd path && disown command &
(cd path && disown command &)
(cd path && command) &
cd path ; command &

Tôi có thể khiến nó bị lỗi, tôi có thể đưa nó đi đến đường dẫn đó và chạy (nhưng không tách rời khỏi thiết bị đầu cuối của tôi) hoặc tôi có thể lấy nó để chạy lệnh tách khỏi thiết bị đầu cuối của mình nhưng tại thư mục làm việc hiện tại của tôi, không phải là đường dẫn cd .

Tôi không thể lấy nó để tách quá trình khỏi thiết bị đầu cuối của mình và chạy lệnh từ một thư mục khác với thư mục của tôi cùng một lúc.

Bạn có thể giúp tôi với điều này? Nó thậm chí có thể?

Câu trả lời:


2

Khác biệt giữa nohup, disown& (bạn cũng có thể tìm thấy câu trả lời này hấp dẫn).

Cú pháp disown command bạn đã sử dụng không hợp lệ, ít nhất là trong Bash; xem help disown. Trong vài trường hợp command & disown là đủ, nhưng

[ command ] vẫn được kết nối với thiết bị đầu cuối, vì vậy nếu thiết bị đầu cuối bị hủy [...], chương trình sẽ thất bại ngay khi nó cố đọc từ đầu vào tiêu chuẩn hoặc ghi vào đầu ra tiêu chuẩn.

Vì thế nohup command & có vẻ tốt hơn, tuy nhiên

nohup không loại bỏ quá trình khỏi kiểm soát công việc của shell

Điều này có vẻ khá vô hại, nhưng nếu nó làm phiền bạn, chỉ cần disown công việc:

nohup command &
disown

Nhưng nếu công việc chấm dứt trước disown hành động sau đó bạn sẽ từ chối khác công việc (nếu có). Cách đúng đắn để làm điều này trong Bash là sử dụng $!:

$! Mở rộng tới ID tiến trình của công việc được đặt gần đây nhất vào nền

Vì vậy, điều này là tốt hơn:

nohup command &
disown $!

(Kể từ khi disown sau nohup chủ yếu là mỹ phẩm, tôi sẽ bỏ qua nó từ bây giờ. Sử dụng nó nếu bạn cần nó).

Đến cd trước command mà không ảnh hưởng đến lớp vỏ hiện tại, cách tốt nhất là thực hiện trong một lớp con (bạn đã thử nó, nhưng không phải với nohup ):

(cd path && nohup command) &

hoặc thậm chí

(cd path && exec nohup command) &

Ở đâu exec làm cho nohup thay thế quá trình subshell không còn cần thiết; nohup sau đó sẽ được thay thế bởi command bởi vì đây là cách công cụ hoạt động. Bằng cách này, bạn kết thúc với một quá trình thay vì nhiều quá trình.

Ngoài ra, bạn có thể nohup toàn bộ vỏ. Điều này cho phép bạn thực hiện nhiều lệnh:

nohup sh -c 'cd path || exit; command1; command2' &

(Trong trường hợp này exec chỉ có ý nghĩa trước đây command2 ).

chú thích nohup tạo một tập tin nohup.out, trừ khi bạn chuyển hướng đầu ra của nó (xem man 1 nohup ). Nơi tập tin được tạo ra phụ thuộc vào thư mục làm việc hiện tại của nohup quá trình, vì vậy nói chung nó làm cho một sự khác biệt cho dù bạn cd trước nohup ( cd path && nohup ... ) Hoặc cách khác xung quanh ( nohup sh -c 'cd path ... ' ).

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.