मैं यह पता लगाने की कोशिश कर रहा हूं कि एक बड़ा जावा प्रोग्राम 'प्रोग' कैसे संचालित किया जाए। अगर मैं इसके / बिन / डीआईआर पर जाता हूं और स्थानीय निर्देशिका और मेरे वर्तमान उपयोगकर्ता खाते का उपयोग करने के लिए इसके setenv.sh और prog.sh को कॉन्फ़िगर करता हूं। फिर मैं इसे "./prog.sh स्टार्ट" के माध्यम से चलाने की कोशिश करता हूं। यहाँ prog.sh के सभी प्रासंगिक बिट्स हैं:
USER=(my current account)
_CMD="/opt/jdk/bin/java -server -Xmx768m -classpath "${CLASSPATH}" -jar "${DIR}/prog.jar""
case "${ACTION}" in
start)
nohup su ${USER} -c "exec ${_CMD} >>${_LOGFILE} 2>&1" >/dev/null &
echo $! >${_PID}
echo "Prog running. PID="`cat ${_PID}`
;;
stop)
PID=`cat ${_PID} 2>/dev/null`
echo "Shutting down prog: ${PID}
kill -QUIT ${PID} 2>/dev/null
kill ${PID} 2>/dev/null
kill -KILL ${PID} 2>/dev/null
rm -f ${_PID}
echo "STOPPED `date`" >>${_LOGFILE}
;;
जब मैं वास्तव में ./prog.sh शुरू करता हूं, तो यह शुरू होता है। लेकिन मैं इसे प्रक्रिया सूची में बिल्कुल नहीं पा सकता हूं। न ही मैं इसे मैन्युअल रूप से मार सकता हूं, उसी कमांड का उपयोग करके शेल स्क्रिप्ट का उपयोग करता है। लेकिन मैं बता सकता हूं कि यह चल रहा है, क्योंकि अगर मैं करता हूं। /pro.sh रोकें, तो यह बंद हो जाता है (और कुछ अस्थायी फ़ाइलें कहीं और खुद को साफ करती हैं)।
./prog.sh start
Prog running. PID=1234
ps eaux | grep 1234
ps eaux | grep -i prog.jar
ps eaux >> pslist.txt
(It's not there either by PID or any clear name I can find: prog, java or jar.)
cd /proc/1234/
-bash: cd: /proc/1234/: No such file or directory
kill -QUIT 1234
kill 1234
kill -KILL 1234
-bash: kill: (1234) - No such process
./prog.sh stop
Shutting down prog: 1234
जहां तक मैं बता सकता हूं, प्रक्रिया अभी तक किसी भी तरह से नहीं चल रही है जो सिस्टम द्वारा सूचीबद्ध है। मैं इसे ps या / proc / में नहीं ढूँढ सकता, और न ही मैं इसे मार सकता हूँ। लेकिन शेल स्क्रिप्ट अभी भी इसे ठीक से रोक सकती है। तो मेरा सवाल यह है कि ऐसा कैसे हो सकता है? क्या प्रक्रिया सर्वोच्च रूप से छिपी हुई है, वास्तव में असूचीबद्ध है, या क्या मैं इसे कुछ फैशन में याद कर रहा हूं? मैं यह पता लगाने की कोशिश कर रहा हूं कि यह कार्यक्रम क्या बनाता है, और मैं मुश्किल से साबित कर सकता हूं कि यह टिक गया है!
संपादित करें:
ps eu | grep prog.sh (after having restarted; so random PID)
50038 19381 0.0 0.0 4412 632 pts/3 S+ 16:09 0:00 grep prog.sh HOSTNAME=machine.server.com TERM=vt100 SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=::[STUFF] 1754 22 CVSROOT=:[DIR] SSH_TTY=/dev/pts/3 ANT_HOME=/opt/apache-ant-1.7.1 USER=[USER] LS_COLORS=[COLORS] SSH_AUTH_SOCK=[DIR] KDEDIR=/usr MAIL=[DIR] PATH=[DIRS] INPUTRC=/etc/inputrc PWD=[PWD] JAVA_HOME=/opt/jdk1.6.0_21 LANG=en_US.UTF-8 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass M2_HOME=/opt/apache-maven-2.2.1 SHLVL=1 HOME=[~] LOGNAME=[USER] SSH_CONNECTION=::[STUFF] LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/grep OLDPWD=[DIR]
मुझे अभी पता चला है कि prog.sh का स्टॉप) हिस्सा वास्तव में इस बात की गारंटी नहीं है कि यह जिस प्रक्रिया को रोकने का दावा करता है वह चल रहा है - यह पीआईडी को मारने की कोशिश करता है और सभी आउटपुट को दबा देता है और फिर अस्थायी फाइल को डिलीट कर देता है और मैन्युअल रूप से STOPPED हो जाता है। लॉग फ़ाइल में। इसलिए मैं अब इतना निश्चित नहीं हूं कि जब मैं इसके लिए पीएस कर रहा हूं तो प्रक्रिया हमेशा चल रही है, हालांकि ऊपर दिए गए कोड का नमूना इंगित करता है कि यह कम से कम गलत तरीके से चलता है। जब मैं कल काम पर लौटूंगा तो मैं इस अनछुए बेमिसाल को देखता रहूंगा।
ps eu | grep prog.sh