การตั้งค่างาน cron ที่ทำ chmod / chown


9

ฉันต้องการตั้งค่างาน cron ที่ทำซ้ำ chmod / chown ในไดเรกทอรี (ไดเรกทอรี dropbox) ซ้ำ ๆ

มันจะทำงานเมื่อฉันรันคำสั่งด้วยตนเองเช่น:

sudo chown -R $USER ~/Dropbox
sudo chmod -R u+rw ~/Dropbox

ฉันพยายามแปลงให้เป็นงาน cron แบบนี้:

10      *       *       *       *       sudo chown -R $USER ~/Dropbox

แต่ดูเหมือนจะไม่ทำงาน

ทำอย่างไร


incron+ inotifyจะแก้ปัญหาการทำความสะอาด :)
franzlorenzon

คำตอบ:


9

คุณต้องการให้สคริปต์ cron รูทของคุณ (แก้ไขโดยเรียกใช้sudo crontab -e) เป็น:

 55 * * * * /bin/chown -R somename /home/somename/Dropbox && /bin/chmod u+rw /home/somename/Dropbox

สมมติว่าชื่อผู้ใช้somenameและ/home/somename/Dropboxเป็นเส้นทางแบบเต็มของไดเรกทอรี Dropbox ของคุณ ในฐานะที่เป็นผู้ใช้ราก ~ /rootไป


1
ขอบคุณสำหรับคำตอบที่ชัดเจน! ฉันคิดว่าสิ่งนี้แสดงลิงก์ที่ขาดหายไปบางส่วนที่ฉันต้องการ ฉันจะทดสอบมันก่อนพรุ่งนี้ :)
tvgemert

ทดสอบแล้วและใช้งานได้!
tvgemert

2
ที่ดี; ดีใจที่มันทำงาน บทเรียนคือ (a) อย่าคาดหวังว่าตัวแปรสภาพแวดล้อม$PATHจะถูกกำหนดเทียบเท่ากับผู้ใช้ที่ลงชื่อเข้าใช้ใน cronjob (เช่นบน linuxbox ของฉัน $ HOME ถูกกำหนดไว้ แต่ $ PATH ถูกตั้งค่าเป็น/usr/binและ/binจาก crontab และ $ USER ไม่ได้กำหนดไว้ดังนั้นในกรณีนี้คุณไม่จำเป็นต้องระบุ/binก่อน chmod / chown), (b) หลีกเลี่ยงsudoในสคริปต์ (รันภารกิจ cron ในฐานะrootผู้ใช้), (c) ในฐานะผู้ใช้รูท$HOMEจะอ้างถึง / root ไม่ใช่ผู้ใช้ปกติของคุณ , (d) ~ควรหลีกเลี่ยงในสคริปต์ cron (โดยค่าเริ่มต้นเป็น#!/bin/sh.
dr jimbob

ฉันขอแนะนำให้เขียนสคริปต์ตามคำแนะนำของเดวิดถ้าคุณทำอะไรที่ซับซ้อนกว่านี้ สคริปต์ดูเหมือน overkill สำหรับการรวมกันของ chmod / chown อย่างไรก็ตามหากคุณเริ่มนำไปใช้กับ Dropbox ของผู้ใช้รายอื่นหรือไดเรกทอรีอื่น ๆ หรือตัดสินใจที่จะทำงานกับไฟล์ที่เพิ่งเปลี่ยนไป (เช่นผลลัพธ์find) และอื่น ๆ มากกว่าที่จะใส่ในสคริปต์
dr jimbob

16

sudoควรเกือบจะ ไม่เคยถูกนำมาใช้ในงานที่กำหนดเวลา คาดว่าจะสามารถพูดคุยกับเทอร์มินัลและกำหนดให้ใช้แฟล็กเฉพาะเพื่อหลีกเลี่ยงการพยายามทำเช่นนั้น

สร้างงาน cron ของคุณในฐานะ root (ใน/etc/crontab- โปรดทราบว่ารูปแบบของไฟล์นี้แตกต่างกันเล็กน้อย:) แทน สิ่งนี้ยังมีประโยชน์ในการทำงานกับระบบที่ไม่ได้ติดตั้งminute hour mday month wdayusercommand
sudo


ขอบคุณ! ฉันสร้างสิ่งนี้ แต่ฉันก็ยังไม่แน่ใจเกี่ยวกับมัน ฉันไม่ได้รับผลลัพธ์ที่คาดหวัง: 55 * * * * root chown -R somename ~/Dropbox
tvgemert

3
somenameอาจเป็นที่ใดก็ได้; มันเป็นเส้นทางสัมพัทธ์ ประการที่สอง~เชลล์เข้าใจเท่านั้น $HOMEใช้ ใช้คำสั่งเช่นนี้: chown -R /some/path/somename $HOME/Dropbox(นี่จะใช้rootโฮมไดเร็กตอรี่ของ ... )
เหม่ย

@David: somenameไม่ใช่เส้นทาง แต่ชื่อผู้ใช้ (และควรมีชื่อกลุ่มsomename:somegroup
:)

5
@tvgemert สิ่งที่เดวิดพูดไว้ข้างต้น (และในคำตอบของเขา) เกี่ยวกับเส้นทาง / เส้นทางสัมพัทธ์ / เส้นทางสัญลักษณ์ ( ~) เป็นสิ่งสำคัญอย่างยิ่ง - โปรดใช้เวลากับหน้า cron และ crontab และให้แน่ใจว่าคุณเข้าใจว่าเกิดอะไรขึ้น (หากมีข้อสงสัย สร้างงาน cron ที่ทำecho "what you want to do" > /tmp/what-i-would-runและดูผลลัพธ์เพื่อให้แน่ใจว่าพวกเขามีสติ - มีโอกาสน้อยมากที่จะทำลายจักรวาล)
voretaq7

ขอบคุณสำหรับคำแนะนำที่เป็นประโยชน์
tvgemert

6

สองประเด็น:

1) เส้นทางไม่ได้ติดตั้งใน cron แบบเดียวกับที่คุณลงชื่อเข้าใช้ลอง / usr / bin / sudo / bin / chown ... (หรือเส้นทางที่ถูกต้องคือโปรแกรมเหล่านั้นในระบบของคุณ)

2) sudo จะถามรหัสผ่านของคุณตามปกติหรืออาจจะไม่มีความสุขในการทำงาน ฉันแนะนำให้คุณใส่คำสั่งใน crontab ของรูทโดยไม่ใช้ sudo แทน, จากนั้นคำสั่งจะรันเป็น root


5

มีปัญหาหลายอย่างกับ crontab ของคุณ:

10 * * * sudo chown -R $USER ~/Dropbox

ประเด็น:

  • sudoไม่ควรใช้ที่นี่ มันต้องการขั้วอินพุต
  • chownควรระบุให้ครบถ้วน (เช่น/bin/chown)
  • USERเนื่องจากตัวแปรจริงอาจไม่มีอยู่จริง บางระบบใช้LOGNAME
  • ~(tilde) จะได้รับการยอมรับจากเชลล์ - เปลือยchownจะไม่เข้าใจมัน
  • การระบุ HOME ใน crontab ของรูทจะไปที่รูทโฮม

ฉันคิดว่าฉันเขียนสคริปต์จริง:

#!/bin/bash

# FILE: /usr/local/bin/myscript

USER=$1
eval chown -R $1 ~$1/Dropbox
eval chmod -R u+rw ~$1/Dropbox

( evalจำเป็นต้องแปลง~$1เป็น~user จากนั้นเป็น/home/user.)

รันสคริปต์นี้จาก crontab ของรูท:

# root's crontab
10 * * * /usr/local/bin/myscript someuser

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