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?
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?
Câu trả lời:
cách đơn giản nhất, sử dụng pgrep
trong crontab:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
để tránh Could not connect to display
lỗi. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
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
pgrep myprog; if [ $? -ne 0 ]; then ...
sẽ được viết tốt hơn làif ! pgrep myprog; then ...
$?
, 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.
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
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.
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
Đ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ị.
* * * * * 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ề.