cron: chạy một tiến trình nhưng chỉ khi nó không chạy?


11

Có cách nào để tôi nói với cron chạy ứng dụng NHƯNG không chạy nó nếu quá trình đã tồn tại?

linux  cron 

Bạn sẽ làm rõ liệu ứng dụng không nên chạy nếu nó đang chạy hay nếu một quá trình khác đang chạy. Cảm ơn
Linker3000

Câu trả lời:


23

cách đơn giản nhất, sử dụng pgrep

trong crontab:

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1

Yêu sự đơn giản của câu trả lời này. FYI, bạn sẽ có thể thêm cờ -f vào pgrep và sau đó bạn có thể kiểm tra tên quy trình đầy đủ, rất hữu ích nếu bạn cũng muốn kiểm tra các đối số cho quy trình như một phần của điều kiện của bạn.
Craig Sefton

6
Không, bạn không thể sử dụng cờ -f với pgrep bên trong cronjob. Lý do là bạn sẽ phù hợp với tập lệnh shell được sử dụng để chạy chính cronjob.
CpnCrunch

Khi chạy một quy trình GUI với cron, hãy thêm vào export DISPLAY=:0để tránh Could not connect to displaylỗi. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Stewam

9

Chạy một kịch bản, thay vì trực tiếp chương trình. Có nhiều khả năng. Ví dụ :

MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
   $RESTART
fi

1
FYI - sử dụng các biến vô hướng để lưu trữ danh sách đối số được coi là thực tiễn xấu. Xem mywiki.wooledge.org/BashFAQ/050 để biết ví dụ về trường hợp thất bại.
Charles Duffy

... tương tự, pgrep myprog; if [ $? -ne 0 ]; then ...sẽ được viết tốt hơn làif ! pgrep myprog; then ...
Charles Duffy

... Kiểu sau này không chỉ dễ đọc hơn mà còn ít bị lỗi hơn: Dễ dàng vô tình phá vỡ giá trị của $?, ví dụ bằng cách thêm thông điệp tường trình hoặc xử lý lỗi giữa các dòng.
Charles Duffy

7

Kịch bản này sẽ không chạy lại nếu phiên bản trước chưa kết thúc. Nếu bạn không muốn chạy một cái gì đó nếu một quy trình cụ thể khác đang chạy, hãy xem tập lệnh của harrymc.

DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;

if flock -n -x 8; then
  echo ""
  echo "Starting your script..."
  echo ""

[PUT YOUR STUFF HERE]

  echo ""
  echo "Script started  $DATE";
  echo "Script finished `date +%c`";
else
  echo "Script NOT started - previous one still running at $DATE";
fi

3

Bạn có thể sử dụng tệp khóa trong tập lệnh của mình, nhưng vui lòng xem Quản lý quy trình .

flock là một tiện ích có thể được sử dụng.


tốt một bây giờ rsync trên đường chậm này có thể mất toàn bộ thời gian cần thiết, bắn trong vòng 5 phút kể từ khi máy chủ đến trực tuyến mà không cần can thiệp thủ công:*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584

1

Điều này thường được xử lý bởi chính chương trình chứ không phải bởi cron. Có hai kỹ thuật tiêu chuẩn cho việc này:

1) grepđầu ra psđể xem liệu có một quy trình theo tên đó đã chạy chưa

2) Khi khởi động, trước tiên hãy kiểm tra sự tồn tại của tệp pid (process id), thường là tại /var/run/program_name.pid, và nếu nó tồn tại, hãy đọc pid ra khỏi tệp và kiểm tra xem quá trình đó có còn tồn tại không; nếu có, từ chối bắt đầu. Nếu tệp pid không tồn tại hoặc pid trong tệp đã biến mất, sau đó tạo tệp pid, ghi id tiến trình của bạn vào đó và tiếp tục khởi động bình thường.

Mặc dù về mặt kỹ thuật có thể viết các ống bash sẽ thực hiện một trong hai ống này trực tiếp vào crontab của bạn, tốt hơn là thêm chúng vào chương trình đang được khởi động (để chúng sẽ áp dụng cho dù nó được bắt đầu như thế nào) hoặc viết một kịch bản trình bao bọc cho xử lý này, như harrymc đề nghị.


0

* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1

Tôi đã sử dụng lại câu trả lời ở trên với sự cải thiện trong việc khớp mẫu. pgrep không có tùy chọn f không phù hợp với mô hình quá trình. Tuy nhiên, có một vấn đề với việc sử dụng tùy chọn f. Với tùy chọn f, shell sinh ra cron luôn được khớp và trả về giá trị của nó do đó quá trình không bao giờ được khởi động lại.

Thêm một [] xung quanh một trong các mẫu chữ cái chỉ khớp với quy trình và pid của vỏ cron không được trả về.

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.