วิธีตั้ง cron PATH ทั่วโลก (เช่นสำหรับผู้ใช้ทั้งหมด) อย่างถาวร?


10

เราจำเป็นต้องมี / usr / local / bin ในเส้นทางของ cron สำหรับผู้ใช้ทั้งหมด มีวิธีการตั้งค่าทั้งระบบโดยไม่จำเป็นต้องแก้ไข crontab ของผู้ใช้แต่ละคน?

เราได้ลองเพิ่ม PATH ไปยัง / etc / crontab:

# grep PATH /etc/crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

แต่เมื่อผู้ใช้มีสิ่งนี้ใน crontab ของพวกเขา:

$ crontab -l | grep PATH
* * * * * echo $PATH > /tmp/current_cron_path

... มันแสดงให้เห็นว่าเส้นทางของพวกเขายังคงตั้งเป็นค่าเริ่มต้น:

$ cat /tmp/current_cron_path
/usr/bin:/bin

2
คำใบ้ทั่วไป: การเขียน "ไม่ทำงาน" โดยปกติแล้วคุณจะไม่ได้รับคำตอบที่เป็นประโยชน์ เสมออธิบายว่ามันไม่ทำงานนั่นคือสิ่งที่คุณทำและสิ่งที่เป็นผล
sleske

โปรดทราบว่าอาศัยechoใน cron ของคุณอาจจะไม่น่าเชื่อถือ
Der Hochstapler

คำตอบ:


4

คุณสามารถกำหนดเส้นทางของคุณในแฟ้มการกำหนด crontab ดังแสดงในรหัสแรกยกเว้นมี ก่อนอื่นให้ระบุตัวแปร env จากนั้นระบุงาน

UPD: เนื่องจากลิงค์ที่ใช้งานไม่ได้นี่เป็นข้อความที่ตัดตอนมา:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

1
ไม่สามารถใช้งานบน Ubuntu ได้แม้หลังจากรีสตาร์ท cron
grosser

1
@grosser: ก็ควร โปรดโพสต์ crontab ทั้งหมดของคุณ (แก้ไขคำตอบของคุณ) พร้อมกับผลลัพธ์ที่สร้างขึ้นและทำไมคุณถึงเชื่อว่ามันไม่ทำงาน จากนั้นเราจะเห็น ...
sleske

นอกจากนี้โปรดทราบว่ารูปแบบของ VARIABLE = บรรทัดค่าค่อนข้าง จำกัด กว่าในเชลล์สคริปต์: การกำหนดแต่ละครั้งจะต้องอยู่ในบรรทัดของมันเองและคุณไม่สามารถใช้ตัวแปรทางด้านขวามือ (เช่น PATH = $ PATH: / bla จะไม่ทำงาน)
sleske

ฉันปรับปรุงคำถาม, การตั้งค่าเส้นทางใน crontab ของแต่ละบุคคลได้ทำงานเพียงการเปลี่ยนแปลงของโลกไม่ได้ทำงาน
เร่อร่า

ลองระบุตัวแปร PATH ในแต่ละ crontab ที่คุณต้องการ อาจเกิดขึ้นเนื่องจากปัญหาด้านความปลอดภัย BTW ใน ubuntu (ฉันได้ตรวจสอบแล้ว) PATH ถูกกำหนดใน / etc / crontab และ /etc/cron.d/anacron ใน ubuntu ดังนั้นดูเหมือนว่ามันจะไม่ถูกสืบทอดจาก / etc / crontab เพียงลองกำหนดในรากของ crontab ( sudo crontab -e)
igorp1024

3

การตั้งค่าตัวแปร PATH ควรทำงานใน Ubuntu คุณจะบอกว่ามันไม่ทำงานอย่างไร

อ้างถึง # 14: Linux Crontab: 15 ตัวอย่างงาน Cron ที่ยอดเยี่ยม


ฉันปรับปรุงคำถาม, การตั้งค่าเส้นทางใน crontab ของแต่ละบุคคลได้ทำงานเพียงการเปลี่ยนแปลงของโลกไม่ได้ทำงาน
เร่อร่า

1

ฉันไม่สามารถหาวิธีแก้ปัญหานี้ได้ สิ่งที่ใกล้เคียงที่สุดที่ฉันได้รับสำหรับโซลูชันที่เหมาะสมคือ (จากhttps://raymii.org/s/tutorials/Better_cron_env_and_shell_control_with_the_SHELL_variale.html )

  • เปลี่ยนเชลล์สำหรับงาน cron ของคุณและชี้ไปที่สคริปต์ทุบตี เช่นที่ด้านบนของ cronjob ให้เพิ่ม: SHELL=/path/to/setup/cron.bash
  • ในเชลล์สคริปต์นี้ให้โหลดตัวแปรสภาวะแวดล้อมและระบุ vars อื่น ๆ ตรวจสอบให้แน่ใจว่าได้รวม 4 บรรทัดต่อไปนี้ไว้ที่ด้านบน มันรีเซ็ตตัวแปร SHELL เป็นทุบตีและดำเนินการเปลือกทุบตีเพื่อเรียกใช้ cronjobs

ตัวอย่างเช่น:

#!/bin/bash
set -e

source /etc/environment
source /etc/profile
# restore SHELL env var for cron
SHELL=/bin/bash

# execute the cron command in an actual shell
exec /bin/bash --norc "$@"

ข้อเสีย: คุณต้องระบุSHELL=...ด้านบนของทุก cronjob Upside: คุณจะใช้ตัวแปรสภาพแวดล้อมปกติและคุณไม่ต้องกังวลกับการรักษาตัวแปรที่สอดคล้องกันระหว่าง cron และอื่น ๆ


0

หากคุณสามารถรูทได้คุณสามารถลองแก้ไข/etc/init.d/cronและเปลี่ยน PATH ได้ไหม? ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่น่าสนใจที่จะตรวจสอบ


ดูเหมือนจะไม่ทำงานผมเพิ่งเพิ่ม PATH = xxx เข้า /etc/init.d/cron แต่ * * * * * * * * * * * * * * * * * * * * echo $ PATH ส่งออกได้เหมือนกัน
เร่อร่า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.