This page is READ-ONLY. It is generated from the old site.
All timestamps are relative to 2013 (when this page is generated).
If you are looking for TeX support, please go to VietTUG.org

solo!!!

very nice tool
Added by over 2 years ago  »  Votes: 2/2

Khi viết kịch bản Bash/Bourne, một vấn đề thường gặp là làm sao tránh trường hợp hai phiên bản khác nhau của cùng một kịch bản chạy song song -- bởi điều đó có thể dẫn tới nhưng kết quả hoàn toàn xa lạ so với ý tưởng của kịch bản. Đối với các kịch bản (chương trình) chạy với chu kỳ ngắn không xác định (crontab với thời gian tối thiểu 1 phút), việc hạn chế tình trạng chạy song song càng quan trọng.

Ở Bash-Hacker [1] bạn có thể tìm thấy vài mẹo, nhưng cách tiếp cận khá phức tạp. Công cụ flock cũng được giới thiệu nhưng flock quá cũ và cách dùng cũng dài dòng.

Hãy xem kịch bản solo (Perl) của Timothy. Ý tưởng là dùng một job manager đơn giản có hai nhiệm vụ

  1. thi hành chương trình chính thông qua exec;
  2. mở một socket duy nhất tương ứng với chương trình đã chạy.

job manager sẽ từ chối thi hành phiên bản khác của chương trình nếu socket cũ chưa đóng :) Vấn đề là socket sẽ được tạo ra như thế nào? Đơn giản: người dùng bất kỳ trên hệ thống có quyền tạo ra socket, chẳng hạn bằng lệnh nc -l 127.0.0.1 1024. Địa chỉ loopback được Timothy sử dụng khéo léo, bằng cách ghép với id của người dùng để không gây trùng lặp socket giữa các người dùng với nhau.

Xem ví dụ dưới đây:

* * * * * solo -port=1630 -silent /mnt/bug_tracker/redmine/mail_recieve.sh

Thiết lập này cho cronjob có nghĩa là: cứ sau mỗi một phút (hoặc gần 1 phút), hệ thống thi hành kịch bản xử lý thư mail_receive.sh một lần; nhưng thông qua solo: nếu việc xử lý thư trước đó diễn ra quá lâu (thời gian kéo dài hơn 1 phút), thì socket đã mở trước đây chưa kịp đóng lại, và solo đơn giản bỏ qua yêu cầu mới của cronjob, để chờ cho tiến trình mail_recieve.sh trước đây hòan tất.

Mã nguồn của solo chỉ khoảng 10 dòng :))

Ref.:
  1. Bash Hacker: http://wiki.bash-hackers.org/howto/mutex?s[]=lock
  2. Tim's solo: http://timkay.com/solo/

Comments

Added by hoangtran over 2 years ago

oh có vẻ tuyệt hay

Em vẫn đặt crontab 3 phút và đây là cái mail run (cat ~/bin/mailrun.sh) của em đây

 1 #!/bin/sh
 2 
 3 PID=`pgrep offlineimap`
 4 
 5 [ -n "$PID" ] && exit 1
 6 
 7 offlineimap -o -u Noninteractive.Quiet &>/dev/null &
 8 
 9 exit 0
10 

Liệu có đơn giản hơn không? Có thể làm thêm timeout để tránh trường hợp chương trình treo???

Added by over 2 years ago

Cách của H. rất đơn giản. Nhưng mọi chuyện phụ thuộc vào kết quả của pgrep -- rất khó để kiểm soát đấy, đặc biệt khi có nhiều người dùng.

Added by ruby 9 months ago

Trục trặc với ssh trong Ubuntu 12 lts https://github.com/timkay/solo/issues/1

Added by ruby 9 months ago

My system is Ubuntu 12 LTS. that is using OpenSSH_5.9p1 ( Debian-5ubuntu1, OpenSSL 1.0.1 14 Mar 2012 ). I tried this

```
solo -port=1234 ssh remote -fN
```

to create a stable tunnel to the remote server. Unfortunately, when `ssh` is executed, it seems to ignore / modify the variable `$^F `, so that

```
solo -port=1234 ssh remote -fN # will execute ssh
solo -port=1234 ssh remote -fN # will execute ssh
```

will launch *two* different ssh connections / processes on my system (the expected result should be *one*)

This problem happens only with `ssh`. If I use `ping 0` instead,

```
solo -port=1235 ping 0 # will execute ping
solo -port=1235 ping 0 # wil exit
```

the program `solo` seems to work well.

I don't encounter this issue with ssh on Ubuntu 10 LTS and Ubuntu 11.

Added by ruby 9 months ago

Tạm thời, bỏ lệnh ssh remote vào bên trong một kịch bản test.sh nào đó là ok

Added by ruby 9 months ago

Tuy nhiên, có sự khác biệt rõ ràng khi dùng bên trong test.sh theo một trong hai cách

  1. exec ssh remote -N
  2. ssh remote -N

Với cách đầu tiên, không có tác dụng. Kịch bản test.sh vẫn được thi hành nhưng không có tiến trình ssh nào được tạo ra. Còn với cách thứ hai thì hoạt động đúng mong đợi.!

Added by ruby 9 months ago

As a work-around, I have to use the wrapper for my `ssh` command

```
#!/bin/bash

# wrapper.sh

ssh remote -N
```

I also note that I can't use `-f` inside the wrapper, nor use `exec ssh remote -N` there.

Added by ruby 8 months ago

Since OpenSSh 5.6p1

20100823
 - (djm) Release OpenSSH-5.6p1

20100816
 - (dtucker) [configure.ac openbsd-compat/Makefile.in
   openbsd-compat/openbsd-compat.h openbsd-compat/strptime.c] Add strptime to
   the compat library which helps on platforms like old IRIX.  Based on work
   by djm, tested by Tom Christensen.
 - OpenBSD CVS Sync
   - [email protected] 2010/08/12 21:49:44
     [ssh.c]
     close any extra file descriptors inherited from parent at start and
     reopen stdin/stdout to /dev/null when forking for ControlPersist.

     prevents tools that fork and run a captive ssh for communication from
     failing to exit when the ssh completes while they wait for these fds to
     close. The inherited fds may persist arbitrarily long if a background
     mux master has been started by ControlPersist. cvs and scp were effected
     by this.

     "please commit" [email protected]
 - (djm) [regress/README.regress] typo