วิธีรัน crontab ในฐานะผู้ใช้: www-data?


32

My LAMP ได้รับการตั้งค่าให้ทำงานuser:www-dataและไฟล์และโฟลเดอร์ทั้งหมดได้รับการสร้างขึ้นโดยได้รับอนุญาต

ฉันมีการตั้งค่าสำหรับ crontab เป็น user @ ubuntu

ดังนั้นฉันจะcrontab -eใช้คำสั่งนี้:

*/5 * * * * php /var/www/public/voto_m/artisan top >/dev/null 2>&1

โดยทั่วไปคำสั่งนั้นจะสร้างไฟล์แคชในตำแหน่งที่ระบุ (ไม่มีปัญหากับไฟล์นั้น) แต่ไฟล์แคชนั้นถูกสร้างขึ้นด้วยผู้ใช้: สิทธิ์ผู้ใช้ไม่ใช่user:www-dataสิทธิ์

ฉันจะทำให้มันเป็นค่าเริ่มต้นสร้างไฟล์ที่มีuser:www-dataสิทธิ์ได้อย่างไร
ฉันไม่สามารถไปได้และchownสร้างไฟล์ใหม่ทุกครั้ง

ขอบคุณ


โปรดทราบว่าสคริปต์ crontab บางตัวที่ทำงานในรูปแบบwww-data (เช่น for awstatsหรือphp5sessionclean) อยู่ใน/etc/cron.*ไดเรกทอรีจึงไม่สามารถมองเห็นได้crontab -e(แม้เมื่อระบุผู้ใช้www-data )
Skippy le Grand Gourou

คำตอบ:


40

คุณสามารถเขียนรายการของคุณลงในระบบ crontab /etc/crontabซึ่งจะมีอาร์กิวเมนต์เพิ่มเติมที่ระบุให้ผู้ใช้เรียกใช้เป็น (โดยปกติคือรูท แต่สามารถเป็นข้อมูล www)

สายของคุณจะกลายเป็น:

*/5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1

หรือคุณสามารถแก้ไข crontab ของผู้ใช้ www-data ด้วยsu:

sudo su -c "crontab -e" www-data

1
จริงๆแล้วตัวเลือกที่สองไม่สามารถใช้งานได้กับ Ubuntu ส่วนใหญ่
user123

ตัวเลือกที่สองใช้งานได้กับฉันใน 12.04LTS บางทีมันอาจจะไม่ได้เป็นเวอร์ชั่นที่ใหม่กว่า?
mivk

1
ตัวเลือกที่สองไม่ทำงานใน 14.04
dgoosens

เพื่อความสะดวกในการจัดการสายนอกจากนี้ยังสามารถใส่ในไฟล์ของตัวเองใน/etc/cron.dที่มีชื่อที่สื่อความหมายเช่น/etc/cron.d/artisan ,
fkraiem

2
สำหรับตัวเลือกที่สองลองใช้แทนsudo su -c "crontab -e" www-data -s /bin/bash
Lunfel


3

ในการรัน crontab ในฐานะผู้ใช้ www-data คุณสามารถใช้คำสั่งต่อไปนี้:

crontab -u www-data -e

จากนั้นคุณเขียนบรรทัดเพื่อเรียกใช้ไฟล์ php ทุก ๆ 15 นาที:

*/15  *  *  *  * php -f /path_to_cron/cron.php

เมื่อบันทึกมันคุณจะถูกถามถึงบรรณาธิการ:

File Name to Write: /tmp/crontab.HMpG7V 

บันทึกไว้ที่นั่นไม่ต้องกังวล crontab -eเปิดไฟล์ใน / tmp แทน crontab จริงเพื่อให้สามารถตรวจสอบข้อผิดพลาด crontab ใหม่ของคุณและป้องกันไม่ให้คุณเขียนทับ crontab จริงของคุณด้วยข้อผิดพลาดเหล่านั้น หากไม่มีข้อผิดพลาด crontab ที่แท้จริงของคุณจะได้รับการอัปเดต ถ้า crontab -e เขียนตรงไปที่ crontab ที่แท้จริงของคุณคุณก็เสี่ยงที่จะทำลาย crontab ทั้งหมดของคุณ

เพื่อตรวจสอบว่า cronjob ของคุณทำงานคุณสามารถตรวจสอบบันทึก cron โดยทั่วไปใน /var/log/cron.log หรือดำเนินการคำสั่งต่อไปนี้:

crontab -u www-data -l

อันนี้ใช้ได้กับฉันบน Ubuntu
tristanbailey

ก่อนหน้านี้ได้รับคำตอบอย่างถูกต้องและรัดกุมยิ่งขึ้นโดยผู้บัญชาการโค้ดด้านบน 4 ปีก่อนหน้านี้ คุณไม่ใช้ "sudo" และโยนข้อมูลที่ไม่ได้รับการร้องขอเกี่ยวกับรูปแบบของ cron line
HörmannHH

@ RichieHH เหตุใดฉันจึงควรเพิ่ม sudo ใครบอกว่าผู้ใช้ไม่ได้ทำงานเป็นรูท? ทุกคนที่ใช้คำสั่งนี้ควรมีความรู้เพียงพอที่จะรู้ว่าถ้าเขาต้องการเรียกใช้คำสั่งด้วยสิทธิ์จะต้องใช้มันด้วย sudo มิฉะนั้นอย่าแตะต้องดีกว่า .. และคุณพูดสั้นกระชับกว่า ... ? ผู้บัญชาการรหัสเพิ่งพิมพ์คำสั่ง แต่ไม่ได้ให้ข้อมูลเพิ่มเติมอีก
spacebiker

.. ถ้าคุณเป็นคนฉลาดคุณควรเริ่มให้คำตอบแทนที่จะวิจารณ์งานของคนอื่นบางทีคุณอาจเริ่มได้รับชื่อเสียงบ้าง
spacebiker

-1

ฉันต้องการเพิ่มวิธีการอื่น อย่างที่คนอื่น ๆ พูดถึง Ubuntu (16.04 ที่นี่) และ www-data crontab ดูเหมือนจะไม่น่าเชื่อถือ (อาจเป็นเรื่องความปลอดภัยหรือไม่)

อย่างไรก็ตามใน บริษัท ของเราเราต้องการให้ cronjobs ทั้งหมดบนเซิร์ฟเวอร์เข้าถึงได้ง่ายดังนั้นคุณจะไม่พลาดอะไรเลย ในขณะเดียวกันเราไม่ต้องการเรียกใช้ทุกสิ่ง (จริง ๆ !) เป็นรูท

ดังนั้นเราจึงวิ่ง

sudo crontab -e 

ตามปกติแล้วคุณจะระบุคำสั่งเป็น

* * * * * /bin/su - www-data -s /bin/bash -c '/path/to/command'

สิ่งนี้จะดำเนินการ / path / to / command เป็น www-data ขณะที่ยังคง cronjob ในไฟล์ root cronjobs (และจะทำงานได้อย่างถูกต้องเสมอ) มันมีข้อดีที่ดีของความสามารถในการเขียน logfiles เป็น root (เพื่อความปลอดภัยสูงสุด) โดยใช้ไพพ์

โปรดทราบว่าเรากำลังผ่านเชลล์ที่ต้องการของเรานี่อาจเป็น / bin / sh สำหรับเชลล์ที่ง่ายกว่า (เราก็เหมือนกับความสามารถในการทุบตีแบบเต็ม) ข้อมูล Www ไม่มีการระบุเชลล์ดังนั้นคุณจะได้รับข้อผิดพลาดหากไม่มี cron โดยปกติรันงานด้วย / bin / sh เท่านั้น

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