informix初始化的時候報: semget: errno = 28

tonykorn97發表於2017-11-23
[informix@onxrjs302 ~]$oninit -ivy 
Checking group membership to determine server run mode...succeeded
Reading configuration file '/home/informix/etc/S302.cfg'...succeeded
Creating /INFORMIXTMP/.infxdirs...succeeded
Checking config parameters...succeeded
Allocating and attaching to shared memory...succeeded
Creating resident pool 280260 kbytes...succeeded
Allocating 200016 kbytes for buffer pool of 2K page size...succeeded
Creating infos file "/home/informix/etc/.infos.onxrjs302"...succeeded
Linking conf file "/home/informix/etc/.conf.onxrjs302"...succeeded
oninit: Fatal error in shared memory creation
Initializing rhead structure...FAILED


WARNING: server initialization failed, or possibly timed out (if -w was used).
Check the message log, online.log, for errors.
[informix@onxrjs302 ~]$onstat -m
shared memory not initialized for INFORMIXSERVER 'onxrjs302'


Message Log File: /home/informix/S302.log
09:24:30  IBM Informix Dynamic Server Started.
09:24:31  semget: errno = 28


09:24:31  create_vp: cannot allocate semaphore
[informix@onxrjs302 ~]$



解決辦法參考如下:http://blog.csdn.net/miss_acha/article/details/10976635

在函式執行時出錯,查詢日誌發現semget函式報錯,errno設定為28。遇到系統呼叫發生錯誤的情況,可以嘗試以下幾種思路:

1. 使用strerror函式或者perror函式輸出錯誤說明。

2. 如果第一步還不是很清楚,可以根據errno的值找出對應的錯誤標示,然後再詳細查閱出錯系統函式的man手冊,找到對應錯誤標示的含義。

PS:大部分時候還是需要採用方法2,例如這次semget函式報錯,errno設定為28,我一開始根本不記得28的錯誤標示是什麼,採用strerror函式返回的錯誤說明為“No space left on device”,我還誤以為系統記憶體不夠。最後透過檢視errno.h標頭檔案才發現28的錯誤標示是ENOSPC,再去查semget函式的man手冊,檢視ENOSPC的具體含義是訊號量超出系統限制:A semaphore set has to be created but the system limit for the  maximum  number of  semaphore  sets  (SEMMNI),  or the system wide maximum number of semaphores。

解決辦法:可以臨時修改核心引數(當然這只是權宜之計,我們最好是找到為什麼訊號量會超出系統限制,因為正常情況下可能性不大。)

1)sysctl命令可以檢視和設定系統核心引數

sysctl -a | grep sem        #檢視系統訊號量的設定值

kernel.sem = 250        32000   32      128

對應的4個值從左到右分別為SEMMSL、SEMMNS、SEMOPM和SEMMNI。

2)修改方法有三種:數字只作為參考

方法一:echo 610 86620 100 142 > /proc/sys/kernel/sem

方法二:sysctl -w kernel.sem="610 86620 100 142"

方法三:echo "kernel.sem=610 86620 100 142" >> /etc/sysctl.conf


errno的值對應的錯誤標示,定義在/usr/include/errno.h標頭檔案中,但是該標頭檔案也是包含其他標頭檔案的。這些標示實際上是定義在下面兩個標頭檔案中:

/usr/include/asm-generic/errno-base.h

/usr/include/asm-generic/errno.h



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-2147640/,如需轉載,請註明出處,否則將追究法律責任。

相關文章