Làm thế nào để hoàn toàn rẽ nhánh một lệnh shell đang sử dụng chuyển hướng


13

Tôi đã viết khá nhiều tập lệnh shell trong nhiều năm qua (nhưng tôi chắc chắn không phải là một sysadmin) và có một điều luôn gây rắc rối cho tôi: làm thế nào tôi có thể tạo ra một lệnh shell miễn dịch với hangouts trong nền từ tập lệnh Bash ?

Ví dụ: nếu tôi có cái này:

command_which_takes_time input > output

Làm thế nào tôi có thể "nohup" và ngã ba này?

Những điều sau đây dường như không làm những gì tôi muốn:

nohup command_which_takes_time input > output &

Cú pháp tôi đang tìm kiếm là gì và tôi không hiểu gì?

Câu trả lời:


13

Hãy thử tạo subshell với (...):

( command_which_takes_time input > output ) &

Thí dụ:

~$ ( (sleep 10; date) > /tmp/q ) &
[1] 19521
~$ cat /tmp/q # ENTER
~$ cat /tmp/q # ENTER
(...) #AFTER 10 seconds
~$ cat /tmp/q #ENTER
Wed Jan 11 01:35:55 CET 2012
[1]+  Done                    ( ( sleep 10; date ) > /tmp/q )

18

Bạn nên thử setsid(1). Sử dụng nó như bạn sử dụng nohup:

setsid command_which_takes_time input > output

Điều này (theo setsid(2)manpage), thực hiện một fork(2), một _exit(2)quy trình cha, sau đó tiến trình con gọi setsid(2)để tạo một nhóm quy trình mới (phiên).

Bạn không thể giết nó bằng cách đăng xuất và nó không phải là một phần của shebang kiểm soát công việc Bash. Đối với tất cả ý định và mục đích, đó là một daemon thích hợp.


4

disownlệnh bash dựng sẵn:

[1] 9180
root@ntb1:~# jobs
[1]+  Running                 sleep 120 &
root@ntb1:~# disown
root@ntb1:~# jobs
... no jobs, disowned
root@ntb1:~# ps aux | grep sleep | grep -v grep
root      9180  0.0  0.0   4224   284 pts/0    S    17:55   0:00 sleep 120
... but the sleep still runing
root@ntb1:~#

Sau khi từ chối , công việc bị từ chối khỏi vỏ của bạn (vì vậy bạn thậm chí có thể đăng xuất) và nó vẫn còn chạy cho đến khi hoàn thành.

Xem jobslệnh 1 được liệt kê sleeptuy nhiên thứ 2 jobssau khi từ chối không. Nhưng sử dụng pschúng ta có thể thấy rằng công việc vẫn đang chạy.


2

Miễn phí:

/usr/sbin/daemon -f <command> <command args>

-2

Điều này sẽ hoạt động (không gõ bất kỳ khoảng trắng thừa):

command &>output.file

1
Điều này dường như không liên quan gì đến câu hỏi, bởi vì nó không rẽ nhánh hoặc đạt được tương đương nohup.
Dan Getz
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.