У меня есть сервер сокетов Java, который я написал, чтобы позволить мне синхронизировать базу кода веб-кластеров. Когда я запускаю скрипт init.d из оболочки, войдите как
[root@web11 www]# /etc/init.d/servermngr start
Выйдите из системы и все будет работать нормально, но если сервер перезагружается или я запускаю init.d с помощью таких служб, как
[root@web11 www]# service servermngr start
Любая из команд exec (), переданных серверу сокетов, не будет выполняться в окне linux. Я предполагаю, что это связано с тем, что у JVM нет реальной оболочки. Если я захожу и запускаю
[root@web11 www]# /etc/init.d/servermngr start
... и выйти из системы все нормально, все команды CVS выполнены.
Еще одно замечание: при запуске в качестве службы сервер сокетов отвечает на проверки состояния, поэтому он работает
Вот скрипт init.d
#!/bin/sh
# chkconfig: 2345 95 1
# description: Starts Daemon Using ServerManager.jar.
#
# Source function library.
. /etc/init.d/functions
start () {
echo -n $"Starting ServerManager: "
# start daemon
cd /www/servermanager/
daemon java -jar ServerManager.jar > /www/logs/ServerManager.log &
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/cups
echo "";
return $RETVAL
}
stop () {
# stop daemon
echo -n $"Stopping $prog: "
kill `ps uax | grep -i "java -jar ServerManager.ja[r]" | head -n 1 | awk '{print $2}'`
RETVAL=$?
echo "";
return $RETVAL
}
restart() {
stop
start
}
case $1 in
start)
start
;;
stop)
stop
;;
*)
echo $"Usage: servermngr {start|stop}"
exit 3
esac
exit $RETVAL
И Java отвечает за фактическое выполнение кода:
// Build cmd Array of Strings
String[] cmd = {"/bin/sh", "-c", "cd /www;cvs up -d htdocs/;cvs up -d phpinclude/"};
final Process process;
try {
process = Runtime.getRuntime().exec(cmd);
BufferedReader buf = new BufferedReader(new InputStreamReader(
process.getInputStream()));
// Since this is a CVS UP we return the Response to PHP
if(input.matches(".*(cvs up).*")){
String line1;
out.println("cvsupdate-start");
System.out.println("CVS Update" + input);
while ((line1 = buf.readLine()) != null) {
out.println(line1);
System.out.println("CVS:" + line1);
}
out.println("cvsupdate-end");
}
} catch (IOException ex) {
System.out.println("IOException on Run cmd " + CommandFactory.class.getName() + " " + ex);
Logger.getLogger(CommandFactory.class.getName()).log(Level.SEVERE, null, ex);
}
Спасибо за любую помощь