Làm cách nào để thực thi mã trong phiên tmux mới - từ trong phiên hiện tại?


13

Tôi sử dụng Ubuntu 16.04 và tôi cần tmuxgiải pháp sau vì tôi muốn chạy quy trình hết thời gian sleepnhư trong trường hợp cụ thể của tôi, tôi không hài lòng atvà gặp lỗi với nohup(khi kết hợp nohup-sleep). Bây giờ, tmuxcó vẻ như là giải pháp thay thế tốt nhất vì nó có cơ chế không bị treo và thực sự hoạt động tốt khi sử dụng thủ công (tôi chỉ đặt câu hỏi liên quan đến tự động hóa quy trình tôi có thể thực hiện thủ công với nó).

Tôi cân gi:

Tôi cần một cách để thực hiện 3 hành động sau, tất cả trong một thao tác:

  1. Đính kèm một tmuxphiên mới .
  2. Tiêm một bộ lệnh sẵn sàng cho phiên đó, như (sleep 30m ; rm -rf dir_name ; exit) . Tôi đặc biệt thích một bộ nhiều dòng, và không phải là một hàng dài.
  3. Thực hiện lệnh trên thiết lập thời điểm nó được hoàn thành để được viết dưới dạng stdin trong tmuxphiên mới .

Nói cách khác, tôi muốn thực thi một bộ mã trong một tmuxphiên khác được tạo đặc biệt cho nguyên nhân đó, nhưng phải thực hiện tất cả trong một thao tác.


Ghi chú:

  • Tôi đặt mục tiêu làm tất cả từ phiên làm việc ban đầu của tôi (công việc tôi làm hầu hết thời gian). Nói chung, tôi không có ý định truy cập vào phiên mới được tạo, tôi chỉ muốn tạo nó với mã được thực thi tự động và đó là nó.

  • Nếu có thể, tôi thích một giải pháp di truyền. Tôi nghĩ rằng nó hiệu quả nhất.

Câu trả lời:


18

Nếu bạn đặt mã bạn muốn thực thi /opt/my_script.sh, ví dụ , rất dễ thực hiện những gì bạn muốn:

tmux new-session -d -s "myTempSession" /opt/my_script.sh

Điều này bắt đầu một phiên tách rời mới, được đặt tên là "myTempSession", thực thi tập lệnh của bạn. Sau này bạn có thể đính kèm để kiểm tra xem nó đang làm gì, bằng cách thực thi tmux attach-session -t myTempSession.

Cái đó là theo tôi giải pháp đơn giản và thanh lịch nhất. Tôi không biết bất kỳ cách dễ dàng nào để thực hiện các lệnh từ stdin (đọc "từ heredocs") với tmux. Bằng cách hack xung quanh bạn thậm chí có thể làm được, nhưng nó vẫn sẽ (và trông giống như) một vụ hack.

Ví dụ, đây là một hack mà sử dụng lệnh tôi gợi ý ở trên để mô phỏng hành vi mà bạn muốn (= thực thi mã trong một phiên tmux mới từ một heredoc. Không ghi xảy ra trên ổ cứng của máy chủ, như các tập tin tạm thời được tạo ra /dev/shm, đó là một tmpfs):

(
  cat >/dev/shm/my_script.sh &&
  chmod +x /dev/shm/my_script.sh &&
  tmux new-session -d '/dev/shm/my_script.sh; rm /dev/shm/my_script.sh'
) <<'EOF'
    echo "hacky, but works"
EOF

1
Mario thân mến. Luôn luôn là một niềm vui để đọc câu trả lời của bạn. Tôi không chắc là tôi có hiểu đúng không, xin vui lòng cho tôi biết nếu tôi sai: 1.Có hai cách để làm như vậy, một là trước tiên tạo một tập lệnh tạm thời (có chứa mã) và thực thi nó với tạo và thứ hai là một di truyền đường. 2.Nếu cách thứ hai hoạt động (khi mỗi hàng echo chứa từng hàng mã của di truyền) thì tại sao chúng ta nên xem đây là một bản hack nếu đó là mã hợp lệ của Bash? Có lẽ bởi vì các hàng của di truyền được lặp lại và không được thực hiện thường xuyên trong heredocs?
JohnDoea

2
@Benia Đó là một hack vì nó chỉ hoạt động trên một số hệ thống Unix có /dev/shm. Đây cũng là một bản hack vì nó phức tạp, khó đọc, dễ hiểu và duy trì hơn là chỉ đơn giản là viết tập lệnh vào một tệp thông thường và bắt đầu với nó tmux.
Kusalananda

1
Như @Kusalananda đã giải thích, heredocs để thực thi mã nói chung là thông lệ xấu. Rõ ràng là xấu xí và không thể đo lường được, nó hoạt động, nhưng nó buộc bạn phải tìm cách làm đường vòng để làm những việc rất đơn giản ... chỉ cần so sánh các khối mã thứ nhất và thứ hai trong câu trả lời: bạn có thể cho biết nó hoạt động như thế nào không? Bạn mất bao lâu để làm điều đó? Nó thậm chí nhiều hơn của một hack như tmux không có cách nào thực hiện lệnh từ stdin (tiết kiệm cho cách thậm chí-hơn-hacky quá xấu xí tôi thậm chí sẽ không xem xét), vì vậy các kịch bản bên ngoài là chỉ (câu trả lời cho 1.câu hỏi của bạn) cách .
Mario Vitale

1
Xin lỗi, có một lỗi trong mẫu đầu tiên (lệnh "phiên mới" không được ngụ ý nếu bạn sử dụng đối số). Bây giờ nó đã được sửa.
Mario Vitale

1
Bây giờ khi tôi thực thi, tmux new-session -d -s "myTempSession" /opt/my_script.shnó không mở tệp tạm thời để tôi dán mã ... Điều tôi cần là mở tập lệnh trực tiếp từ phiên hiện tại hoặc ít nhất là một cái gì đó để chuyển sang phiên mới và sau đó trực tiếp quay lại phiên hiện tại. BTW Tôi dự định sẽ đưa tiền thưởng cho tất cả sự giúp đỡ của bạn vì đó là điều tối thiểu tôi có thể làm để cảm ơn bạn và tôi có thể đưa tiền thưởng trong 11 giờ.
JohnDoea

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.