เรียกใช้สคริปต์ทุบตีเมื่อลงชื่อเข้าใช้ที่เก็บไว้ในโฟลเดอร์หลักหรือไม่


19

เมื่อฉันพยายามโหลด LaunchAgent plist จากlaunchctlฉันไม่สามารถหาวิธีเรียกใช้สคริปต์ในโฮมไดเร็กตอรี่ได้

รหัสของฉันคือ:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>~/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

ฉันได้พยายามทั้งที่มีและไม่มีทุบตีและแทนที่ด้วย~ $HOMEฉันได้ลองใช้bash -cโดยไม่ทำงาน

รหัสข้อผิดพลาดคือ:

`com.tyilo.test: bash: ~/script.sh: No such file or directory`

ลองวางพา ธ แบบเต็มเช่น /Users/name/script.sh (นอกจากนี้ฉันจะทำให้สคริปต์ทำงานได้และบรรทัดแรก #! / bin / bash และรันโดยตรง)
user151019

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

1
หากจะใช้หลายบัญชีของฉันคุณควรใส่ไว้ใน / usr / local / bin / แทนที่จะทำสำเนาหลายชุดใน $ HOME ของผู้ใช้แต่ละคน การรู้ว่าคุณกำลังพยายามทำให้สำเร็จด้วยสคริปต์นี้จะเป็นประโยชน์หรือไม่ ดูเหมือนว่าเป็นงานสำหรับ LoginHook, IMO
TJ Luoma

คำตอบ:


14

EnableGlobbingเปิดใช้งานการขยายตัวหนอนและไวด์การ์ดสำหรับProgramArguments:

<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>say</string>
    <string>~/*</string>
</array>

ไม่ส่งผลกระทบProgramหรือWatchPathsอย่างไรก็ตามการขยายตัวหนอนทำงานWatchPathsตามค่าเริ่มต้น


นี่เป็นวิธีที่ดีกว่าในการทำเช่นนี้ มีสถานที่ที่คุณสามารถดูเอกสารประกอบสำหรับคีย์ในตัวเรียกใช้งาน LaunchAgent ได้หรือไม่
Tyilo

ผู้ชาย launchd.plist หรือดูโพสต์บล็อกหรือเว็บไซต์ของฉัน
Lri

1
สิ่งนี้ช่วยฉันด้วย พยายามใน Mac OS X เวอร์ชั่นต่อไปนี้: 10.7, 10.8 และ 10.9
Dj S

6
โปรดทราบ: คุณลักษณะนี้ถูกลบใน Yosemite ( Mac OS X 10.10+)
alex grey

ดูเหมือนว่ามันจะไม่อยู่ใน 10.9.5 เลย
ocodo

18

EnableGlobbingไม่ทำงานบน OS X Yosemite 10.10 มันเลิกใช้แล้ว (อ้างอิง )

คุณสามารถดูในบันทึกThe EnableGlobbing key is no longer respected. Please remove it.(จาก/var/log/system.log)

ปัญหาคือlaunchdcwd (ไดเรกทอรีการทำงานปัจจุบัน) คือ/ดังนั้นคุณไม่สามารถใช้./เหมือนที่บางคนกล่าว

(bash|zsh|sh) -cเมื่อต้องการเรียกใช้สคริปต์จากบ้านของคุณด้วยวิธีง่ายๆคือการใช้งาน ตัวเลือก วิธีนี้คุณจะมีความสามารถในการใช้เครื่องหมายตัวหนอน~หรือ$HOMEตัวแปร

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>org.your.stuff</string>
    <key>ProgramArguments</key>
    <array>
      <!-- here is the important thing -->
      <string>zsh</string>
      <string>-c</string>
      <string>~/you/script/in/your/home</string>
    </array>

    <!-- code below is just for the example -->
    <!-- Keep running... -->
    <key>KeepAlive</key>
    <true />
    <!-- ...every day. In sec, 60*60*24 = every day -->
    <key>ThrottleInterval</key>
    <integer>86400</integer>
  </dict>
</plist>

2
ผมไม่คิดว่าคุณสามารถใช้ตัวหนอนกับsh; เมื่อ Bash เกี่ยวข้องกับshมันมันจะทำงานในโหมดความเข้ากันได้ POSIX ซึ่งปิดใช้งานส่วนขยาย Bash จำนวนมาก
tripleee

~/กำลังกลืนกินไม่ได้รับการสนับสนุน คุณสามารถใช้./แทนตราบใดที่ daemon ถูกบันทึกในไลบรารีผู้ใช้ ( ~/Library/LaunchAgents)
Bruno

9

ความน่าเชื่อถือที่สุดที่ฉันพบในการทำเช่นนี้คือการใช้shและHOMEตัวแปรสภาพแวดล้อม:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>"$HOME/script.sh"</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

หมายเหตุ:จำเป็นต้องใช้เครื่องหมายคำพูด


2

การรู้ว่าเหตุใดสคริปต์จึงต้องเรียกใช้จากไดเรกทอรีหลักของผู้ใช้ หากคุณต้องการชื่อย่อของผู้ใช้สำหรับสคริปต์คุณสามารถรับได้โดยกำหนดให้กับตัวแปรเช่นเดียวกับใน

user=`whoami`

จากนั้นใช้$userในสคริปต์

ฉันจะวางสคริปต์ไว้ที่อื่นนอกเหนือจากโฮมไดเร็กตอรี่จากนั้นผู้ใช้อื่นสามารถเข้าถึงได้บนคอมพิวเตอร์เครื่องเดียวกัน คุณสามารถใช้ไดเรกทอรีที่ใช้ร่วมกันหรือวางสคริปต์ใน / Library / Scripts /

คุณจะต้องใช้เส้นทางแบบเต็มสำหรับ Plist Plist นอกจากนี้ในโปรแกรมเรียกใช้งานของคุณคุณไม่จำเป็นต้องระบุ<string>bash</string>เนื่องจากคุณควรมี shebang ในสคริปต์และควรจะสามารถเรียกใช้งานได้


การระบุbashว่าคำสั่งจริงเพื่อดำเนินการเป็นทางเลือกที่ดีโดยไม่มีความเสียหายจริง หากเขาไม่มี shebang หรือลืมที่จะทำให้สคริปต์ทำงานได้ (o = rwx) bash จะยังคงเรียกใช้ / เรียกใช้สคริปต์
Jason Salaz

1
ควรมีตัวแปรสำหรับชื่อผู้ใช้เช่น $ USER หรือ $ LOGNAME นอกจากนี้ตำแหน่งปกติสำหรับสคริปต์ Unix ที่ใช้ร่วมกันจะเป็น / usr / local / bin / (ไม่ใช่ว่าคุณไม่สามารถวางไว้ที่อื่น แต่ / usr / local / bin / จะเป็น $ PATH อยู่แล้ว)
TJ Luoma

การใช้ whoami เป็นอีกวิธีหนึ่งในการรับข้อมูลเดียวกันกับ $ USER หรือ $ LOGNAME ฉันแนะนำที่ตั้งด้านบนเนื่องจากฉันไม่ต้องการเข้าใจสิ่งที่สงสัย นอกจากนี้ก่อนที่จะพยายามทำให้การเรียกใช้ Plist ทำงานได้จริงสคริปต์จะต้องสามารถเรียกใช้จาก CLI ได้
afragen

1

มันปฏิบัติการได้ไหม?

chmod 700 ~/script.sh

ในเทอร์มินัล นอกจากนี้ฉันจะไม่ใช้ $ HOME หรือ ~ แต่ใช้เส้นทางที่แท้จริงไปยังไฟล์

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.tyilo.test</string>
    <key>ProgramArguments</key>
    <array>
        <string>/path/to/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

เหตุผลในการ downvote คืออะไร?
TJ Luoma

1

หากสคริปต์ของคุณเป็นตัวแทนผู้ใช้ (และอยู่ในไลบรารีของโฟลเดอร์ Home) launchdไดเรกทอรีการทำงานปัจจุบันของคือโฟลเดอร์ Home UNIX อ้างถึงโฮมไดเร็กทอรีที่มีเครื่องหมายจุดในพา ธ

ดังนั้นโดยทั่วไปใช้แทน./script.sh ~/script.sh;-)


3
ไม่ไดเร็กทอรีการทำงานของ launchd จริงๆแล้ว/ไม่ใช่ '~'
Tyilo

@Tyilo ฉันไม่แน่ใจว่าคุณหมายถึงอะไร หากคุณหมายถึง "ไดเรกทอรีทำงานของ launchd คือรูทในทุกกรณี - แม้ในโหมดผู้ใช้" โปรดระบุข้อมูลอ้างอิง หากคุณหมายถึง "launchd ใช้เครื่องหมายทับแทนเครื่องหมายตัวหนอน" อ่านโพสต์ของฉันอีกครั้ง ยังไงก็ตามฉันมีสคริปท์หลายตัวใน launchd และพวกเขาก็ทำตามพฤติกรรมที่ฉันอธิบาย ;-)
Constantino Tsarouhas

1
@RandyMarch ฉันทำตัวแทนเปิดตัวในที่มีการขัดแย้งนี้:~/Library/LaunchAgents , , เมื่อวิ่งไฟล์ที่มีอยู่ไม่ได้ sh-cecho $HOME > /Users/Tyilo/launchd_home.txt/Users/Tyilo/launchd_home.txt//Users/Tyilo
Tyilo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.