Synology शेड्यूलर .sh जावा कमांड नहीं मिला


9

मेरे पास एक bash स्क्रिप्ट है, केवल एक जार फ़ाइल को निष्पादित करने का कार्य है।

sms.sh

java -jar /volume1/homes/jar/smssender.jar

अपने Synology NAS का उपयोग करके मैंने एक कार्य स्थापित किया।

टास्क सेटअप रूट द्वारा चलाया जाता है

बैश स्क्रिप्ट निष्पादित करने के लिए कमांड जोड़ना। लॉग आउटपुट जोड़ना।

यहां छवि विवरण दर्ज करें

मेरी नई टास्क को एक्सेप्ट करना।

यहां छवि विवरण दर्ज करें

निम्नलिखित त्रुटि देखने के लिए लॉग की जाँच:

/volume1/homes/jar/sms.sh: पंक्ति 1: जावा: कमांड नहीं मिली

जावा संस्करण / स्थापना की जाँच:

यहां छवि विवरण दर्ज करें

मैन्युअल रूप से श स्क्रिप्ट के निष्पादन की जाँच करना (काम करना):

यहां छवि विवरण दर्ज करें

कोई भी इसी अजीब मामले के साथ? किसी भी काम / विचार?

मैंने कोशिश की

  • मेरे एनएएस को रिबूट करना
  • Java8 पैकेज को अनइंस्टॉल / इंस्टॉल करें

लेकिन किसी ने काम नहीं किया।


4
आपकी समस्या को देखते हुए, यह संभवतः एक env (JAVA_HOME, PATH) के साथ एक समस्या है जब नौकरी निष्पादित नहीं होती है। आप या तो निष्पादन योग्य java निष्पादन योग्य पथ का उपयोग करना चाहिए, या तो आपके लिए ऐसा करने वाली फ़ाइल का स्रोत।
NoDataFound

@NoDataFound पूर्ण पथ के साथ क्या मतलब है? Isnt /volume1/(..)/file.jar पथ? मदद और समय के लिए धन्यवाद
पिगी

3
सबसे पहले, जावा निष्पादन योग्य खोजें। फिर, इसका उपयोग करके आह्वान करें /whatever/path/to/java/is/java /volume1/homes/jar(यह पर्यायवाची के लिए विशिष्ट नहीं है)
NoDataFound

1
हमें शायद यहां यह जोड़ना चाहिए कि जो भी उपयोगकर्ता कमांड चला रहा है वह संभवतः वह उपयोगकर्ता नहीं है जो ओपी के साथ लॉग इन कर रहा है (जब तक कि उसे यकीन नहीं है), और इसलिए उसका एक अलग पैठ है।
बैडजेन

((इसके अलावा यह वास्तव में विषय है?)
बैडज़ेन

जवाबों:


5

जब Synology टास्क शेड्यूलर स्क्रिप्ट sms.shको निष्पादित करता है तो PATH सेटिंग स्क्रिप्ट से ली जाती है /etc/crontab। जिसमें जावा पथ शामिल नहीं है।

डिफ़ॉल्ट लॉगिन शेल वातावरण int परिभाषित किया गया है /etc/profile। अंत में जावा पथ को जोड़ने के लिए एक खंड है।

PATH=$PATH:/var/packages/Java8/target/j2sdk-image/bin # Synology Java runtime enviroment
PATH=$PATH:/var/packages/Java8/target/j2sdk-image/jre/bin # Synology Java runtime enviroment
JAVA_HOME=/var/packages/Java8/target/j2sdk-image/jre # Synology Java runtime enviroment
CLASSPATH=.:/var/packages/Java8/target/j2sdk-image/jre/lib # Synology Java runtime enviroment
LANG=en_US.utf8 # Synology Java runtime enviroment
export CLASSPATH PATH JAVA_HOME LANG # Synology Java runtime enviroment

जैसा कि पहले से ही पहले से दी गई टिप्पणियों में कहा गया है कि एक प्रोफ़ाइल स्क्रिप्ट की सोर्सिंग जो कि एक इंटरेक्टिव शेल के लिए है, का सुझाव नहीं दिया गया है। आप /etc/profileअपनी sms.shस्क्रिप्ट में CLASSPATH PATH JAVA_HOME LANG सेट करने के लिए स्क्रिप्ट के व्यवहार की नकल कर सकते हैं ।

अपनी स्क्रिप्ट में पथ को हार्डकोड करने के बारे में उठाए गए बिंदु और परिणामी कम पोर्टेबिलिटी के कारण इस विशिष्ट मामले में एक प्रेमी पूर्वता हो सकती है।


आपके उत्तर से मुझे बहुत मदद मिली और यह सही है लेकिन मैंने अपने फोन पर मिसकॉल किया और नीचे दिए गए उपयोगकर्ता को 100 अंक दिए। मैं वास्तव में माफी चाहता हूँ
2

@piguy वह लाइव है। ;-)
सबऑप्टिमल

-1

मैं Synologyइतनी fwiw से परिचित नहीं हूँ ...

शेल स्क्रिप्ट तब काम करती है जब कमांड लाइन पर निष्पादित की जाती है क्योंकि विशेष लॉगिन सत्र ने पहले से ही पर्यावरण चर का एक सेट लोड किया है (उदाहरण के लिए, .profile/.bashrcगृह निर्देशिका में स्क्रिप्ट (ओं) पर लॉग इन किया जाता है और विभिन्न जावा-विशिष्ट पर्यावरण चर लोड किए जाते हैं - PATH, JAVA_HOME, CLASSPATHआदि) कि अनुमति javaऔर स्क्रिप्ट मुद्दे के बिना चलाने के लिए।

असफल Synologyनौकरी त्रुटि इंगित करती है कि जावा-विशिष्ट वातावरण चर लोड नहीं किए गए हैं और इसलिए नौकरी / स्क्रिप्ट का पता लगाने में असमर्थ है java

मान लें Synologyकि कॉन्फ़िगरेशन सेटिंग / फ़्लैग नहीं है जो किसी लॉगिन प्रोफ़ाइल को प्री-लोड करने के लिए स्टाइपुलेट करता है, तो स्क्रिप्ट को संपादित करने के लिए 'आसान' समाधान होगा ( sms.sh) और किसी भी ऑपरेशन (जैसे, कॉलिंग java) करने से पहले उपयुक्त संसाधन फ़ाइल का स्रोत होगा । एक सरल उदाहरण:

$cat sms.sh
#!/usr/bin/bash

. ~root/.bashrc      # load the root account profile before continuing ...

java ...

नोट :

  • rootउस लॉगिन के नाम से बदलें जिसके तहत स्क्रिप्ट को चलाया जाना है (उदाहरण के Synologyचित्र में यह प्रतीत होता है कि आपने rootउपयोगकर्ता को चुना है इसलिए मेरे उदाहरण संदर्भ ~root)
  • ~root/.bashrcस्क्रिप्ट को खोजने की अनुमति देने के लिए आवश्यक पर्यावरण चर को पूर्व-लोड करने के लिए उपयोगकर्ता की प्रोफ़ाइल के पथ के साथ बदलेंjava

कृपया गैर-सक्रिय संदर्भों में उपयोग किए जाने वाले इंटरेक्टिव उपयोग के लिए लिखी गई कॉन्फ़िगर फ़ाइलों को प्रोत्साहित न करें - यह उन स्थितियों की ओर ले जाती है, जहां लोग सोचते हैं कि वे जो परिवर्तन कर रहे हैं वे हानिरहित हैं (क्योंकि .bashrcयह परिवर्तन कैसे नहीं करता है कि डेमॉन संचालित होता है, सही?) लेकिन इसके बजाय कारण हो सकते हैं उत्पादन टूटना।
चार्ल्स डफी

1
वास्तविक स्थान को खोजने के लिए बेहतर है और स्क्रिप्ट में एक उपयुक्त पथ अद्यतन को हार्डकोड के रूप में या केवल समर्पित उद्देश्य कॉन्फ़िगरेशन स्क्रिप्ट स्रोतों में दर्ज करें। यह उन स्थितियों में भी काम करता है जहाँ यह प्रासंगिक /etc/profile.dनहीं है , जब तक ~/.bashrcकि प्रासंगिक नहीं है।
चार्ल्स डफी

हार्डकोडिंग शायद ही पोर्टेबल है, खासकर मिश्रित ओएस / संस्करण वातावरण में; विशेष रूप से निर्मित संसाधन / कॉन्फिग फाइलों के रूप में इंटरेक्टिव कॉन्फिगर / रिसोर्स फाइल्स का उपयोग करने के लिए ... यह डेवलपर (एस) के पर्यावरण को बनाए रखने / बनाए रखने के आधार पर एक व्यक्तिगत पसंद का मुद्दा है; मैं पिछले 20 वर्षों में कोई / शून्य समस्याएँ नहीं है ... उत्पादन वातावरण में ... एक पूरी स्क्रिप्टिंग env, ymmv
markp-fuso

1
उपयोगकर्ता की इंटरएक्टिव फ़ाइलों में डॉटिंग पोर्टेबल नहीं है (विशेष रूप से यह बताया गया है कि डिस्ट्रोस रिबैलेंस किस सामग्री के द्वारा किया जाता है, कौन सी फाइलें हैं - कुछ पारंपरिक तरीके से काम कर रही हैं और उपयोग कर रही हैं .profile, कुछ का उपयोग कर रही हैं .bash_profile, कुछ का उपयोग कर रही हैं /etc/profile.d, कुछ पैम से पर्यावरण चर स्थापित कर रही हैं, आदि) । एक तरह से या किसी अन्य, आप कुछ नॉनपोर्टेबल कर रहे हैं। कम से कम हार्डकोडिंग सेटिंग्स PATH=$PATH:/whatever/specific/locationमें संशोधन कर रहा है , और इसका व्यवहार पाठकों के लिए स्पष्ट है (जिन्हें इस बारे में चिंता करने की आवश्यकता नहीं है कि यह बाद में बदल जाएगा)।
चार्ल्स डफी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.