- PR -

起動スクリプトが「OK」でずに。。。

1
投稿者投稿内容
sarika
会議室デビュー日: 2004/12/15
投稿数: 5
投稿日時: 2004-12-17 10:29
お世話になります。
私は、初めて起動スクリプトを書くのですが、スクリプトのスタートを実行すると、その後に「OK」が出ずにずっと待つ状態みたいになっています。前のスレッドを参考したが解決できません。分かる方がいらしゃったら、教えてください。ちなみに私が書いたスクリプトは以下のとおりです。script fileは、/ect/rc.d/init.dの下に置いてあります。そして、iserverは、メッセージを受けて、大文字に変換して送り返すだけのサーバです。

#!/bin/bash

# Source function library
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
if [ ${NETWORKING} = "no" ]
then
exit 0
fi

# Path to the server
SERVER=/usr/app/iserver
# Check that server path is correct
[ -f $SERVER ] || exit 1
prog=iserver
RETVAL=0

# Functions
start() {
echo -n $"Starting $prog: "
daemon $SERVER
RETVAL=$?
[ $RETVAL -ne 0 ] && failure
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog && success
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc $SERVER
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/$prog
}
reload() {
echo -n $"Reloading $prog: "
killproc $SERVER -HUP
RETVAL=$?
echo
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $SERVER
RETVAL=$?
;;
restart)
stop
start
;;
reload)
reload
;;
*)
echo $"Usage: $prog {start|stop|restart|reload|status}"
exit 1
esac

exit $RETVAL

---------------------------------------------------------
・iserver のコード
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 8765
#define BACKLOG 5
int main(void){

int i;
int nameLen;
int servSocket,clntSocket;
struct sockaddr_in saddr;
struct sockaddr_in caddr;
char buf[1024];
int len,ret;

servSocket=socket(PF_INET,SOCK_STREAM,0);
if(servSocket<0){
perror("socket");
EXIT_FAILURE;
}

bzero((char *)&saddr,sizeof(saddr));
saddr.sin_family=AF_INET;
saddr.sin_addr.s_addr=INADDR_ANY;
saddr.sin_port=htons(PORT);

if(bind(servSocket,(struct sockaddr *)&saddr,sizeof(saddr))<0){
perror("bind");
EXIT_FAILURE;
}

if(listen(servSocket,BACKLOG)<0){
perror("listen");
EXIT_FAILURE;
}

len=sizeof(caddr);
clntSocket=accept(servSocket,(struct sockaddr *)&caddr,&len);
if(clntSocket<0){
perror("accept");
EXIT_FAILURE;
}
close(servSocket);

ret=read(clntSocket,buf,1024);
printf("受信:%s",buf);
while(strcmp(buf,"quit\\\\n")!=0){
for(i=0;i<ret;i++){
if(isalpha(buf[i]))buf[i]=toupper(buf[i]);
}

write(clntSocket,buf,1024);
printf("送信:%s\\\\n",buf);
ret=read(clntSocket,buf,1024);
printf("受信:%s",buf);
}

close(clntSocket);
return EXIT_SUCCESS;
}

よろしくお願いします。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2004-12-17 11:17
まずご質問内容ですが、Insider .NET ではなく UNIX 系 OS (Linux?) での問題に見えます。
これが正しければ適切な会議室に移動をお願いします。

本題に入ります。

ブート用スクリプトを書かれているので C プログラムが文字変換サービスを提供するデーモンとして動作することを期待していると思われますが、提示された C プログラムはデーモンとしての要件を満たしていません。
現象としては、通常プログラムをブートスクリプトから呼び出しており、それがクライアントからの受信を待ったまま終了しないため、スクリプト全体も終了しないと考えられます。

デーモンプロセスを作成されるのであれば、それなりの勉強を積むようお願いします。
検索キーワードとしては、デーモンプロセス、fork、exec、あたりで検索すると、適切なサイトが見つかるようです。(実際に試してみました
sarika
会議室デビュー日: 2004/12/15
投稿数: 5
投稿日時: 2004-12-17 11:36
Gioさん、ご返答ありがとうございました。勉強不足で、本当にすみません。
sarika
会議室デビュー日: 2004/12/15
投稿数: 5
投稿日時: 2004-12-17 11:44
このスレッドをLinux系に移動します。すみません。
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2004-12-17 13:21
/var/lock/subsys の下に iserver っちゅぅファイルはできておるかね?
start() 中の

daemon $SERVER
RETVAL=$?

この部分で、ちゃんと戻り値 RETVAL は取れておるかね?
1

スキルアップ/キャリアアップ(JOB@IT)