Làm cách nào để thêm mục vào crontab của tôi?


13

Tôi đang sử dụng crontab lần đầu tiên. Muốn viết một vài nhiệm vụ cron thử nghiệm rất đơn giản và chạy chúng.

$crontab * * * * * echo "Hi"

không sản xuất bất cứ thứ gì.

crontab */1 * * * * echo "hi"

nói */1: No such file or directory.

Ngoài ra, làm cách nào để liệt kê các tác vụ cron hiện đang chạy (không chỉ các tác vụ tôi sở hữu mà cả các tác vụ được bắt đầu bởi người dùng khác như root).

Và làm cách nào để xóa một tác vụ cron cụ thể?


Để được hướng dẫn về cách chỉnh sửa và tạo các công việc định kỳ và giải thích về cấu trúc tệp, hãy xem hướng dẫn cú pháp crontab
KJS

Câu trả lời:


21

Bạn không thể sử dụng crontabnhư vậy. Sử dụng man crontabđể đọc về cách gọi chính xác tiện ích này.

Bạn sẽ muốn sử dụng crontab -eđể chỉnh sửa các mục cron hiện tại của người dùng (bạn có thể thêm / sửa đổi / xóa dòng). Sử dụng crontab -lđể xem danh sách các tác vụ được cấu hình hiện tại.

Đối với việc nhìn thấy các crontabs của người dùng khác, điều đó là không thể nếu không được root trên các cài đặt mặc định. Xem Làm thế nào để tôi liệt kê tất cả các công việc định kỳ cho tất cả người dùng để biết một số cách để liệt kê mọi thứ (dưới dạng root).

Lưu ý: hãy thật cẩn thận khi bạn sử dụng các ký tự shell shell trên dòng lệnh ( *?đặc biệt). *sẽ được mở rộng vào danh sách các tập tin trong thư mục hiện tại, có thể có tác dụng không mong muốn. Nếu bạn muốn chuyển *như một đối số cho một cái gì đó, hãy trích dẫn nó ( '*').


Vì vậy, tôi làm crontab -e và trong trình chỉnh sửa, tôi đặt mục nhập * / 1 * * * * echo "hi" và khi tôi lưu tệp này, tôi thấy thông báo rằng crontab: cài đặt crontab mới. nhưng tôi không thấy các tin nhắn hi xuất hiện trên màn hình. Tôi đang thiếu gì bây giờ? cảm ơn.
xyz

2
đầu ra của crontab sẽ không bao giờ đi đến "màn hình" của bạn. Từ trang hướng dẫn POSIX cho crontab: "Nếu đầu ra tiêu chuẩn và lỗi tiêu chuẩn không được chuyển hướng bởi các lệnh được thực thi từ mục crontab, mọi đầu ra hoặc lỗi được tạo sẽ được gửi qua thư, thông qua phương thức phụ thuộc thực hiện, cho người dùng."
Mat

1
Đầu ra của công việc sẽ được gửi đến hộp thư cục bộ của chủ sở hữu công việc. (Chạy mailtừ dòng lệnh sẽ truy cập vào hộp thư cục bộ của bạn, nếu được định cấu hình.) Để xem 'hi' trong môi trường đồ họa, bạn có thể đặt tác vụ là : * * * * * export DISPLAY=:0; xmessage 'hi'.
manatwork

@manatwork Bạn cũng có thể cần XAUTHORITY, điều này có thể không dễ dàng .
derobert

7

Có hai cách chỉnh sửa crontab:

  1. tương tác, sử dụng crontab -e, sẽ mở crontabtrình soạn thảo được chỉ định bởi $VISUALhoặc $EDITOR, hoặc

  2. không tương tác, sử dụng crontab crontab.txt, sẽ chỉ nhập các crontabmục từ tệp crontab.txt, thay thế crontab hoạt động hiện có cho người dùng hiện tại.

Vấn đề mà bạn có là bạn đang sử dụng crontabsai lệnh.


Các vấn đề sau đây liên quan đến thao tác crontab không tương tác:

Vì vậy, để loại bỏ các tác vụ cụ thể theo lập trình, bạn có thể làm một cái gì đó như

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

trong đó PATTERNmột biểu thức chính quy sẽ khớp với (các) tác vụ mà bạn muốn xóa. Ở đây, crontab -lsẽ cung cấp cho bạn hiện tại của bạn crontab.

Hoặc, nếu bạn có các mục trong một tệp được gọi là crontab-fragment.txtbạn muốn xóa khỏi crontab đang hoạt động,

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

Điều này đọc crontab hiện tại và lọc ra (loại bỏ) bất kỳ dòng nào cũng xảy ra trong tệp crontab-fragment.txttrong thư mục hiện tại (sử dụng so sánh chuỗi dòng đầy đủ). Kết quả được lưu vào crontab.txtvà sau đó được tải từ đó để thay thế crontab hiện tại.

Để thêm một hoặc một số nhiệm vụ , hãy làm một cái gì đó như

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

Điều này giả sử rằng tệp crontab-fragment.txtchứa các mục mà bạn muốn thêm. Nó đọc crontab hiện tại, nối các mục từ crontab-fragment.txtnày và tạo crontab.txt. Các crontab.txttập tin sau đó thay thế crontab hiện tại.


2

Nếu bạn muốn sửa đổi crontab tương tác, hãy chạy lệnh crontab -e, không có tùy chọn nào khác. Điều này sẽ bắt đầu một trình soạn thảo trên một bản sao của crontab; Khi bạn thoát khỏi trình chỉnh sửa, bản sao đã chỉnh sửa sẽ trở thành crontab mới. Bạn có thể kiểm soát trình soạn thảo nào được bắt đầu thông qua các biến VISUALEDITORmôi trường . Để liệt kê crontab của bạn, chạy crontab -l.

Nếu bạn muốn sửa đổi crontab trong tập lệnh, hãy đặt VISUALEDITORđường dẫn đến tập lệnh hoặc đoạn mã shell để sửa đổi tệp được cung cấp tại chỗ. Trình chỉnh sửa edlà một khả năng ở đây hoặc sed -inếu việc triển khai của bạn sedcó tùy chọn này. Nếu bạn muốn thêm vô điều kiện một dòng, bạn có thể sử dụng echo … >>. Hãy cẩn thận với trích dẫn; nếu có nghi ngờ, hãy viết một tập lệnh và chuyển tên của tập lệnh thành EDITOR.

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF

2

Đây là một chút muộn, nhưng đối với những người khác đang tìm kiếm ở đây. Có nhiều cách dễ dàng hơn so với thao tác các luồng đầu vào / đầu ra với VISUALEDITOR.

Bạn có thể chỉ cần viết lịch trình cron của bạn trong một tệp, 1 công việc trên mỗi dòng và sử dụng lệnh crontab [filename]để bạn có thể thực hiện catcông việc của mình filenamenhư một phần của tập lệnh và cuối cùng gọi crontab ở cuối nếu bạn muốn.

trong thực tế, đây là cách sử dụng phổ biến nhất như man crontabgợi ý bằng cách liệt kê nó trước


2

Nếu bạn muốn thêm các mục vào crontabtự động hóa hoặc từ dòng lệnh, bạn có thể làm (thiết lập thời gian bạn muốn có)

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

Sau đó:

service crond reload

để tải lại các crontabs.


Điều này là không thể tin được; không phải tất cả unix lưu trữ các tập tin crontab bên dưới /var/spool/cron. Một cách tốt hơn sẽ thông qua crontab(1)lệnh.
thrig

Điều đó có thể đúng, nhưng đó là thể hiện nguyên tắc về cách bạn có thể làm điều đó trên một hệ thống, và vâng, crontab thực hiện thủ thuật nếu bạn muốn thêm từng dòng một. Nó không có nghĩa là một câu trả lời tuyệt đối, nhưng là một câu trả lời nếu bạn biết công cụ của mình ở đâu và bạn cần thêm hàng loạt. Mang nó cho những gì nó là.
Chris Sprucefield

1

Hãy thử nó với lệnh này:

crontab -e 

sau đó thêm công việc định kỳ của bạn:

*/1 * * * * echo "hi"

trong tập tin đó


0

Tôi muốn làm nổi bật cách tôi mô tả dưới đây mặc dù nó đã được đề cập trước đó trong một bình luận khác. Tôi thấy nó cực kỳ hữu ích khi thêm các mục vào một tệp và sau đó thêm tệp vào crontab. Tệp đó sẽ chứa hai mục bên dưới và tên tệp sẽ là hello-world-crontab.txt.

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

Sau đó, tôi thực hiện lệnh dưới đây để thêm các mục này vào crontab.

  • $ crontab hello-world-crontab.txt

Bước tiếp theo là xác minh những mục này đã được thêm vào.

  • $ crontab -l

Một lời giải thích ngắn gọn về những gì mỗi mục làm:

  • Mục crontab này viết "Xin chào thế giới!" vào tập tin /home/user/greeting.txtmỗi ngày lúc 9 giờ sáng.
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • Crontab này thực thi một tệp python in trong dòng lệnh 'Xin chào thế giới!' mỗi ngày vào lúc 9 giờ sáng.
    • 0 09 * * * python /home/user/greeting.py
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.