Script không chạy qua crontab nhưng hoạt động độc lập tốt


51

Tôi có một đoạn script nhắc tôi khởi động lại máy tính nếu uptimehơn 3 ngày (mặc dù nó được đặt thành 0 ngày bây giờ chỉ để kiểm tra xem tập lệnh có chạy không khi máy tính của tôi chỉ hoạt động được hơn một ngày ..).

Tôi nhận ra đó không phải là kịch bản thanh lịch nhất nhưng tôi đang cố gắng! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/username/uptime.foo && awk < /home/username/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Tôi đã làm cho nó có thể thực thi được chmod + x checkup.shvà nó hoạt động tốt khi tôi chạy nó qua thiết bị đầu cuối thông qua./checkup.sh

Mục crontab của tôi cho kịch bản này là:

46 14 * * * /home/username/Desktop/./checkup.sh

Vì vậy, nó chạy lúc 14: 46 giờ hàng ngày ...

Vì vậy, ... tôi đang nghĩ nó nên chạy, trừ khi tôi không làm điều gì đó thực sự ngớ ngẩn. Ngoài ra, bạn có nghĩ rằng việc chuyển tập lệnh bash này sang /binkhông?


1
Tôi sẽ đặt nó vào / opt / bin hoặc ~ / bin như một cách thực hành tốt nhất chung để không làm hỏng nơi mà các gói nghĩ rằng mọi thứ.
RobotHumans

Nếu bạn chạy tập lệnh như vậy: /home/dnaneet/Desktop/./checkup.sh thì nó có hoạt động không? Tôi sẽ đặt /home/dnaneet/Desktop/checkup.sh
LnxSlck

@LnxSlck Vâng, chạy /home/dnaneet/Desktop/./checkup.shhoạt động tốt. Nhưng /home/dnaneet/Desktop/checkup.shcó thể không hoạt động phải không? Vì nó cần a ./?
dearN

1
Tôi không nghĩ rằng cron biết bất cứ điều gì về phiên X của bạn.
glenn jackman

@glennjackman Vậy điều đó có nghĩa là gì? Điều đó có nghĩa là việc chạy một kịch bản như vậy thông qua crontab không cho phép một thông báo bật lên hiển thị trong môi trường gnome?
dearN

Câu trả lời:


71

Một việc tại một thời gian:

Trước tiên, hãy cung cấp cho bạn thư mục bin dựa trên người dùng:

cd ~/ && mkdir bin

Bạn muốn sử dụng crontab. Hãy bắt đầu với một cái gì đó thực sự đơn giản:

* * * * * touch /tmp/testing.txt

Được rồi, vậy là xong

Bây giờ hãy thử chạy một kịch bản tương tự

* * * * * /home/username/bin/touchtest.sh

để chạy một lần một phút cho đến khi bạn làm cho nó hoạt động
Không bạn không cần một ./ ở giữa dòng. ./ là khi bạn đưa ra các url tương đối.
Được rồi, vậy là xong

Bây giờ, hãy thử chạy tập lệnh gọi xmessage

* * * * * /home/username/bin/rebootwarn.sh

không làm việc

Đầu tiên chúng ta cần không phụ thuộc vào các biến môi trường. Điều này bao gồm cài đặt đường dẫn, cài đặt x11 hoặc bất cứ thứ gì khác (các biến môi trường python và ruby ​​xuất hiện trong tâm trí ...)

Chúng ta hãy làm cho chúng ta trông giống như tệp cron thích hợp của anacron..Tôi đã lưu nó dưới dạng thử nghiệm

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Đặt để chạy một lần một phút

crontab test để nhập nó

Bật kịch bản

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print $3 }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"`

Được rồi, vậy nó hoạt động ... chúng ta đã làm gì?
Chúng tôi đã thay đổi tất cả các lệnh không phụ thuộc vào các đường dẫn mà chúng tôi không đặt rõ ràng
Chúng tôi đã chạy tập lệnh của chúng tôi một cách rõ ràng bằng bash
Chúng tôi đã nói với tập lệnh mà chúng tôi dự kiến ​​sẽ có trên HIỂN THỊ: 0,0


Cảm ơn câu trả lời. Bạn nói "Chúng ta hãy làm cho chúng ta trông hơi giống tập tin cron thích hợp của anacron..Tôi đã lưu nó dưới dạng thử nghiệm" .. CHÚNG TÔI là gì? Các tập tin crontab? :-/
dearN

Đây là những gì tôi quan sát. Đầu tiên tôi phải loại bỏ khoảng trống trước và sau =để chỉ định dòng DISPLAY. Thứ hai, khi tôi chỉnh sửa tệp crontab của mình và thêm vào PATHnhư được đề xuất và đặt thời gian để chạy sau đó, cửa sổ bật lên không hiển thị. Tuy nhiên, cửa sổ bật lên hiển thị tốt khi chạy tập lệnh bằng cách sử dụng /bin/bash... cái gì cho?
dearN

Bạn biết gì không, một khi tôi thay đổi kịch bản của mình thành export DISPLAY=:0.0, nó hoạt động tốt. Mặc dù có một lang đáng kể khoảng 5 giây sau khi đồng hồ bấm giờ khi cửa sổ bật lên của tôi hiển thị ... Có gợi ý nào không? Nhưng có, sửa đổi của bạn để kịch bản làm việc!
dearN

Không có ý tưởng về độ trễ 5 giây.
RobotHumans

3
Tôi thích cách bạn đi qua từng bước này và sau đó tóm tắt nó - cảm ơn!
jbobbins

10

Vấn đề đã được giải quyết, đọc hướng dẫn trong Google:

sự miêu tả:

  1. Tôi có tập lệnh sử dụng #!/bin/bashlàm tiêu đề
  2. Tôi đặt kịch bản /home/wc3/palert/

phân tích:

  1. crontab không thể chạy tập lệnh của tôi
  2. Nhưng nếu tôi chạy thủ công, nó sẽ hiển thị đầu ra và tôi cũng có thể thấy kết quả trên web của mình
  3. Điều đó có nghĩa là crontab không thể có được môi trường không như khi bạn chạy tập lệnh của mình trên thư mục tập lệnh

câu trả lời:

  1. đặt môi trường của bạn bằng cách sử dụng dòng này bên dưới vào tập lệnh của bạn với:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    thay đổi điều này: /home/wc3/palert
    với: nơi bạn đặt tập lệnh của mình, vd/home/budi/script.sh

mẫu vật:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Hãy thử đặt tập lệnh của bạn lên crontab.


không làm việc cho tôi
John Joe

Làm việc như một cơ duyên cho tôi!
1rq3fea324wre
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.