Gọi một lệnh / script bị ngắt kết nối từ thiết bị đầu cuối kiểm soát?


9

Tôi đang điều tra hành vi của một tập lệnh thường chạy dưới dạng một quy trình tự động (ví dụ: cron, Jenkins). Kịch bản có thể (cuối cùng) gọi các lệnh hoạt động khác nhau (tìm kiếm đầu vào của người dùng) khi chạy tương tác; ví dụ, patchsẽ hỏi phải làm gì với một bản vá đảo ngược và svnsẽ hỏi mật khẩu, nhưng tôi cần xem điều gì xảy ra khi chúng chạy không tương tác.

Thuyết phục patchrằng nó không tương tác là khá dễ dàng; Tôi chỉ cần chuyển hướng stdoutđể trở thành một người không tty:

$ </dev/null > >(cat) /path/to/myscript --args

Tuy nhiên svnsẽ kết nối với thiết bị đầu cuối kiểm soát nếu nó tồn tại; chỉnh sửa các tập lệnh để vượt qua --non-interactivethực sự không phải là một lựa chọn vì điều này đến từ nhiều cấp độ và rất khó để chắc chắn tôi đã tìm thấy mọi lời mời.

Có cách nào để gọi một kịch bản / lệnh không tương tác, mà không có thiết bị đầu cuối kiểm soát (vì vậy /dev/ttykhông tồn tại)? Tôi muốn stdout / stderr vẫn đi đến thiết bị đầu cuối của tôi.

(Tôi tìm thấy câu hỏi Chạy kịch bản trong một vỏ không tương tác? Nhưng câu trả lời cho rằng thảo luận về sự khác biệt giữa các cron và môi trường người dùng;. Tôi đã loại bỏ tất cả những khác biệt trừ phi tương tác)

Câu trả lời:


13

Bạn cần bắt đầu một phiên khác không được gắn vào thiết bị đầu cuối, ví dụ:

$ setsid sh -c 'tty; ps -jp "$$"; echo test' < /dev/null > log 2>&1
$ cat log
not a tty
  PID  PGID   SID TTY          TIME CMD
19506 19506 19506 ?        00:00:00 sh
test

Xem thêm start-stop-daemonlệnh tìm thấy trên một số bản phân phối Linux. Ngoài ra còn có một daemonlệnh.


Sản lượng này có nghĩa là gì? Trông rất khó hiểu.
anatoly techtonik

2
@anatolytechtonik các phần quan trọng là "không phải là một tty" là đầu ra của ttyviệc xác nhận không có thiết bị đầu cuối trên stdin và "?" trong cột TTY của psđầu ra xác nhận không có tty kiểm soát cho shquá trình (và bất cứ điều gì chạy theo nó).
mr.spuratic

Để chạy lệnh như bất kỳ lệnh nào khác, sử dụng setsid -w. Ví dụ: setsid -w sh -c 'tty < /dev/tty'give sh: 1: cannot open /dev/tty: No such device or address(Lưu ý: /dev/ttylà tty kiểm soát của bạn). Không có -wsetsid chạy quá trình song song / nền.
Tino

0

Có lẽ bạn sẽ muốn làm một kịch bản mong đợi. Ví dụ với SVN:

/programming/609445/USE-recect-to-login-into-svn


Điều đó không hiệu quả; mong đợi chạy các lệnh tương tác.
ecatmur

Tương tác theo nghĩa nào? Theo nghĩa là nó yêu cầu đầu vào từ người dùng? Nếu đó là những gì bạn muốn nói, sẽ không có nhiều điểm mong đợi tồn tại trong trường hợp đó. Một ví dụ tôi sử dụng là trên Solaris, lệnh passwd không có tùy chọn --stdin vì vậy tôi có một cronjob được thiết lập để thực thi một tập lệnh mong đợi bao quanh passwd để cung cấp mật khẩu ngẫu nhiên cho tài khoản. Không cần tương tác của con người. Theo hiểu biết của tôi thì đây là yêu cầu của người dùng. Tôi có thể đã hiểu lầm mặc dù.
Bratchley

Trên thực tế, tôi càng đọc lại nó, tôi càng nhận ra mình đã hiểu sai về những gì bạn sẽ làm. Lời xin lỗi.
Bratchley

0

Đôi khi bạn cần giữ stdin mở (không nhận eof trên stdin) (ví dụ như mong đợi). Trong trường hợp đó, thay đổi / dev / null thành / dev / zero.

setsid sh -c 'make test' </dev/zero >log 2>&1
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.