สคริปต์ไม่ทำงานผ่าน crontab แต่ทำงานได้ดีแบบสแตนด์อโลน


51

ฉันมีสคริปต์ที่เตือนให้ฉันรีสตาร์ทคอมพิวเตอร์หากuptimeมีมากกว่าพูด 3 วัน (แม้ว่าจะตั้งไว้ที่ 0 วันตอนนี้เพียงเพื่อตรวจสอบว่าสคริปต์ทำงานอยู่หรือไม่เพราะคอมพิวเตอร์ของฉันใช้งานได้มากกว่าหนึ่งวัน .. )

ฉันรู้ว่ามันไม่ใช่สคริปต์ที่งดงามที่สุด แต่ฉันพยายามแล้ว! :)

#!/bin/bash

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

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

ฉันทำให้มันใช้งานได้โดยchmod + x checkup.shและทำงานได้ดีเมื่อฉันเรียกใช้เทอร์มินัลเทียวผ่าน./checkup.sh

รายการ crontab ของฉันสำหรับสคริปต์นี้คือ:

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

ดังนั้นจึงวิ่งเวลา 14: 46hrs ทุกวัน ...

ดังนั้น ... ฉันคิดว่ามันควรจะทำงานเว้นแต่ว่าฉันจะไม่ทำอะไรโง่ ๆ นอกจากนี้คุณคิดว่าคุณสามารถย้ายสคริปต์ทุบตีนี้ไปได้/binหรือไม่?


1
ฉันจะใส่ไว้ใน / opt / bin หรือ ~ / bin เป็นวิธีปฏิบัติทั่วไปที่ดีที่สุดเพื่อไม่ให้มีโคลนซึ่งแพ็คเกจคิดว่าเป็นอย่างไร
RobotHumans

หากคุณเรียกใช้สคริปต์เช่นนั้น: /home/dnaneet/Desktop/./checkup.sh ใช้งานได้หรือไม่ ฉันจะใส่ /home/dnaneet/Desktop/checkup.sh
LnxSlck

@LnxSlck ใช่ทำงาน/home/dnaneet/Desktop/./checkup.shได้ดี แต่/home/dnaneet/Desktop/checkup.shอาจไม่ทำงานใช่ไหม เพราะมันต้องการ./?
เรียน

1
ฉันไม่คิดว่า cron รู้อะไรเกี่ยวกับเซสชัน X ของคุณ
เกล็นแจ็คแมน

@glennjackman นั่นหมายความว่าอย่างไร หมายความว่าการเรียกใช้สคริปต์ผ่าน crontab ไม่อนุญาตให้มีข้อความป๊อปอัปแสดงขึ้นในสภาพแวดล้อมของ gnome หรือไม่
เรียน

คำตอบ:


71

สิ่งหนึ่งครั้ง:

ก่อนอื่นเราจะให้โฟลเดอร์ bin ตามผู้ใช้ของคุณ:

cd ~/ && mkdir bin

คุณต้องการใช้ crontab เริ่มจากสิ่งที่ง่ายจริงๆ:

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

โอเคมันก็ใช้ได้

ตอนนี้เราลองเรียกใช้สคริปต์ที่ทำเช่นเดียวกัน

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

ทำงานหนึ่งนาทีจนกว่าคุณจะทำงาน
ไม่คุณไม่จำเป็นต้องใช้. / กลางบรรทัด ./ สำหรับเมื่อคุณให้ URL แบบสัมพัทธ์
โอเคมันก็ใช้ได้

ทีนี้ลองเรียกใช้สคริปต์ที่เรียก xmessage

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

ไม่ทำงาน

ก่อนอื่นเราต้องไม่ขึ้นอยู่กับตัวแปรสภาพแวดล้อม ซึ่งรวมถึงการตั้งค่าเส้นทางการตั้งค่า x11 หรือสิ่งอื่นใด (ตัวแปรสภาพแวดล้อมของหลามและทับทิมเป็นสิ่งสำคัญ ... )

ลองทำให้ไฟล์ของเราดูเหมือนไฟล์ cron ที่เหมาะสมของ anacron .. ฉันบันทึกสิ่งนี้เป็นการทดสอบ

#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

ตั้งค่าให้ทำงานหนึ่งครั้งต่อนาที

crontab test เพื่อนำเข้า

เมื่อวันที่สคริปต์

#!/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!"`

โอเคงั้นนั่นล่ะ ... เราทำอะไรลงไป?
เราเปลี่ยนคำสั่งทั้งหมดไม่ให้ขึ้นอยู่กับพา ธ ที่เราไม่ได้ตั้งไว้อย่างชัดเจน
เรารันสคริปต์ของเราอย่างชัดเจนด้วย bash
เราบอกสคริปต์ว่าเราคาดว่าจะแสดงบนจอ: 0.0


ขอบคุณสำหรับคำตอบ. คุณบอกว่า "มาทำให้พวกเราดูคล้ายกับไฟล์ cron ที่เหมาะสมของ anacron .. ฉันบันทึกสิ่งนี้เป็นแบบทดสอบ" .. อะไรของเรา? ไฟล์ crontab? :-/
เรียน

นี่คือสิ่งที่ฉันสังเกตเห็น ครั้งแรกที่ฉันจะต้องได้รับการกำจัดของพื้นที่ก่อนและหลังสำหรับการระบุสาย= DISPLAYประการที่สองเมื่อฉันแก้ไขไฟล์ crontab ของฉันและเพิ่มPATHตามที่แนะนำและตั้งเวลาให้ทำงานในภายหลังหน้าต่างป๊อปอัปจะไม่แสดง อย่างไรก็ตามหน้าต่างป๊อปอัปแสดงผลได้ดีเมื่อรันสคริปต์โดยใช้/bin/bash... จะให้อะไร
เรียน

คุณรู้อะไรเมื่อฉันเปลี่ยนสคริปต์เป็นexport DISPLAY=:0.0มันใช้งานได้ดี ถึงแม้ว่าจะมีความหมายของเวลาประมาณ 5 วินาทีหลังจากที่นาฬิกาปลุกชั่วโมงเมื่อหน้าต่างป๊อปอัปของฉันควรแสดง ... คำแนะนำใด ๆ ? แต่ใช่การแก้ไขสคริปต์ของคุณ!
เรียน

ไม่มีความคิดเกี่ยวกับความล่าช้า 5 วินาที
RobotHumans

3
ฉันชอบวิธีที่คุณผ่านขั้นตอนนี้แล้วสรุปมัน - ขอบคุณ!
jbobbins

10

ปัญหาได้รับการแก้ไขอ่านคู่มือใน Google:

คำอธิบาย:

  1. ฉันมีสคริปต์ที่ใช้#!/bin/bashเป็นส่วนหัว
  2. ฉันใส่สคริปต์ /home/wc3/palert/

วิเคราะห์:

  1. crontab ไม่สามารถเรียกใช้สคริปต์ของฉัน
  2. แต่ถ้าฉันรันด้วยตนเองมันจะแสดงผลลัพธ์และฉันสามารถเห็นผลลัพธ์ในเว็บของฉันได้
  3. หมายความว่า crontab ไม่สามารถรับสภาพแวดล้อมที่ไม่เหมือนเมื่อคุณเรียกใช้สคริปต์ในโฟลเดอร์สคริปต์ของคุณ

ตอบ:

  1. ทำให้สภาพแวดล้อมของคุณใช้บรรทัดนี้ด้านล่างบนสคริปต์ของคุณด้วย:

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

    เปลี่ยนสิ่งนี้/home/wc3/palert
    ด้วย: สถานที่ที่คุณใส่สคริปต์ของคุณเช่น/home/budi/script.sh

ตัวอย่าง:

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

ลองใส่สคริปต์ของคุณใน crontab


ไม่ทำงานสำหรับฉัน
John Joe

ทำงานเหมือนมีเสน่ห์สำหรับฉัน!
1rq3fea324wre
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.