วิธีการระบุใน crontab โดยผู้ใช้สิ่งที่เรียกใช้สคริปต์? [ปิด]


176

ฉันมีงาน crontab ไม่กี่งานที่ทำงานภายใต้รูท แต่นั่นทำให้ฉันมีปัญหา ตัวอย่างเช่นโฟลเดอร์ทั้งหมดที่สร้างขึ้นในกระบวนการของงาน cron นั้นอยู่ภายใต้รูทผู้ใช้และกลุ่มรูท ฉันจะทำให้มันทำงานภายใต้ผู้ใช้ www-data และกลุ่ม www-data ได้อย่างไรเมื่อฉันเรียกใช้สคริปต์จากเว็บไซต์ของฉันฉันสามารถจัดการโฟลเดอร์และไฟล์เหล่านั้นได้อย่างไร

เซิร์ฟเวอร์ของฉันทำงานบน Ubuntu
งาน crontab ปัจจุบันคือ:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

คำตอบ:


335

แทนที่จะสร้าง crontab เพื่อรันในฐานะผู้ใช้รูทให้สร้าง crontab สำหรับผู้ใช้ที่คุณต้องการรันสคริปต์ ในกรณีของคุณcrontab -u www-data -eจะแก้ไข crontab สำหรับผู้ใช้ www-data เพียงแค่ใส่คำสั่งเต็มของคุณในนั้นและลบออกจาก crontab ของผู้ใช้รูท


54
มันทำงานในลักษณะเดียวกันเมื่อคุณใช้crontab -eในฐานะผู้ใช้เฉพาะ
kulak

7
แต่ crontab นี้จะถูกตรวจสอบเมื่อระบบเริ่มทำงานหรือเฉพาะเมื่อผู้ใช้ล็อกอิน?
Bruno Finger

11
cronระบบ * nix ไม่ต้องการให้ผู้ใช้ลงชื่อเข้าใช้เพื่อเรียกใช้งานที่ระบุใน crontab ของผู้ใช้ที่ระบุ
ไมค์

2
สิ่งนี้จะตั้งรหัสกลุ่มเป็น OP ที่ถามหรือไม่ ถ้ากลุ่มหนึ่งต้องการแตกต่างจากกลุ่มหลักของผู้ใช้
askyle

49

แก้ไข: โปรดทราบว่าวิธีนี้จะไม่ทำงานกับ crontab -e แต่จะใช้ได้เฉพาะเมื่อคุณแก้ไข / etc / crontab โดยตรง มิฉะนั้นคุณอาจได้รับข้อผิดพลาดเช่น/bin/sh: www-data: command not found

หน้าชื่อโปรแกรม:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

ที่จะทำให้มันทำงานเป็นแม่มดผู้ใช้ apache เป็น www-data ใช่มั้ย
ARMA

19
โปรดทราบว่าวิธีนี้ใช้ไม่ได้crontab -eแต่จะใช้ได้เฉพาะเมื่อคุณแก้ไข/etc/crontabโดยตรง อ่านความคิดเห็นที่ด้านบนของไฟล์นี้สำหรับข้อมูลเพิ่มเติม
imgx64

5
ผู้ใช้สามารถระบุได้ในระบบ crontab เท่านั้น
James Roth

ฉันมีงานไม่กี่งานตามกำหนดเวลาในระบบ crontab เมื่อฉันทำsudo crontab -eฉันเห็นงาน แต่ฉันเปิดไฟล์/etc/crontabไม่มีงาน แปลกหรือเปล่า นอกจากนี้ถ้าฉันsudo crontab -eและเพิ่มงานที่ผู้ใช้ระบุจะทำงานได้หรือไม่
eNeMetcH

14

เนื่องจากคุณกำลังใช้อูบุนตู crontab /etc/crontabระบบของคุณตั้งอยู่ที่

ในฐานะผู้ใช้รูท (หรือใช้ sudo) คุณสามารถแก้ไขไฟล์นี้และระบุผู้ใช้ที่ควรรันคำสั่งนี้ นี่คือรูปแบบของรายการในระบบ crontab และวิธีที่คุณควรป้อนคำสั่งของคุณ:

# m h dom mon dow user  command
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

แน่นอนว่าควรตั้งค่าการอนุญาตสำหรับสคริปต์ PHP และไฟล์บันทึกของคุณเพื่อให้www-dataผู้ใช้สามารถเข้าถึงได้


ฉันคิดว่าสิ่งนี้ควรจะเทียบเท่ากับcrontab -e; แต่ไม่.
zinking

5
เอกสารของ Ubuntu ไม่แนะนำให้แก้ไข / etc / crontab เพราะสามารถเขียนทับได้โดยการอัพเดท crontab -e จะสร้างไฟล์ cron เฉพาะผู้ใช้ใน / var / spool / cron / crontabs
Hemm

9

คุณสามารถลองใช้runuser(เป็น root) เพื่อเรียกใช้คำสั่งในฐานะผู้ใช้อื่น

*/1 * * * * runuser php5 \
            --command="/var/www/web/includes/crontab/queue_process.php \
                       >> /var/www/web/includes/crontab/queue.log 2>&1"

ดูสิ่งนี้ด้วย: man runuser


runuserไม่รวมอยู่ใน Ubuntu
Raptor

1
runuser อยู่ใน Ubuntu เวอร์ชันล่าสุด นอกจากนี้ยังมีทางเลือกอื่นสำหรับ runuser ตามที่กล่าวไว้ในคำตอบนี้unix.stackexchange.com/questions/169441/ubuntu-runuser-commandเช่น su และ sudo
Russell E Glaue

8

คำแนะนำของไมค์ดูเหมือน "ถูกต้อง" ฉันเจอกระทู้นี้ที่ต้องการระบุผู้ใช้ให้ทำงานvncserverเมื่อรีบูตและต้องการเก็บงาน cron ทั้งหมดไว้ในที่เดียว

ฉันได้รับข้อผิดพลาดต่อไปนี้สำหรับ VNC cron:

vncserver: The USER environment variable is not set. E.g.:

ในกรณีของฉันฉันสามารถใช้sudoเพื่อระบุผู้ที่จะทำงานเป็น

@reboot sudo -u [someone] vncserver ...

1
ฉันได้รับข้อความนี้ในบันทึก:sudo: sorry, you must have a tty to run sudo
Renato Gama

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