linux进程状态exit143,linux - 停止服务时单元进入故障状态(状态= 143)[关闭] - 堆栈内存溢出...

这是我的问题。 我运行了CentOS和java进程。 Java进程由启动/停止脚本操作。 它也创建了一个java实例的.pid文件。

我的单位文件看起来像:

[Unit]

After=syslog.target network.target

Description=Someservice

[Service]

User=xxxuser

Type=forking

WorkingDirectory=/srv/apps/someservice

ExecStart=/srv/apps/someservice/server.sh start

ExecStop=/srv/apps/someservice/server.sh stop

PIDFile=/srv/apps/someservice/application.pid

TimeoutStartSec=0

[Install]

WantedBy=multi-user.target

当我调用stop函数时,脚本使用SIGTERM终止java进程并返回0代码:

kill $OPT_FORCEKILL `cat $PID_FILE`

return 0

之后,如果我检查我单位的状态,我得到类似的东西(状态= 143):

● someservice.service - Someservice

Loaded: loaded (/usr/lib/systemd/system/someservice.service; enabled; vendor preset: disabled)

Active: failed (Result: exit-code) since Wed 2017-08-30 09:17:40 EEST; 4s ago

Process: 48365 ExecStop=/srv/apps/someservice/server.sh stop (code=exited, status=0/SUCCESS)

Main PID: 46115 (code=exited, status=143)

Aug 29 17:10:02 whatever.domain.com systemd[1]: Starting Someservice...

Aug 29 17:10:02 whatever.domain.com systemd[1]: PID file /srv/apps/someservice/application.pid not readable (yet?) after start.

Aug 29 17:10:04 whatever.domain.com systemd[1]: Started Someservice.

Aug 30 09:17:39 whatever.domain.com systemd[1]: Stopping Someservice...

Aug 30 09:17:39 whatever.domain.com server.sh[48365]: Stopping someservice - PID [46115]

Aug 30 09:17:40 whatever.domain.com systemd[1]: someservice.service: main process exited, code=exited, status=143/n/a

Aug 30 09:17:40 whatever.domain.com systemd[1]: Stopped Someservice.

Aug 30 09:17:40 whatever.domain.com systemd[1]: Unit someservice.service entered failed state.

Aug 30 09:17:40 whatever.domain.com systemd[1]: someservice.service failed.

当我在启动/停止脚本中没有return值时,它的行为完全相同。

添加到单元文件中的内容如下:

[Service]

SuccessExitStatus=143

对我来说不是个好主意。 为什么systemctl这样做并且没有显示我正常的服务状态?

当我尝试修改我的开始/停止脚本而不是return 0我将return 10它的行为相同,但我可以看到exit 10已通过。

这是一个例子:

● someservice.service - Someservice

Loaded: loaded (/usr/lib/systemd/system/someservice.service; enabled; vendor preset: disabled)

Active: failed (Result: exit-code) since Wed 2017-08-30 09:36:22 EEST; 5s ago

Process: 48460 ExecStop=/srv/apps/someservice/server.sh stop (code=exited, status=10)

Process: 48424 ExecStart=/srv/apps/someservice/server.sh start (code=exited, status=0/SUCCESS)

Main PID: 48430 (code=exited, status=143)

Aug 30 09:36:11 whatever.domain.com systemd[1]: Starting Someservice...

Aug 30 09:36:11 whatever.domain.com systemd[1]: PID file /srv/apps/someservice/application.pid not readable (yet?) after start.

Aug 30 09:36:13 whatever.domain.com systemd[1]: Started Someservice.

Aug 30 09:36:17 whatever.domain.com systemd[1]: Stopping Someservice...

Aug 30 09:36:17 whatever.domain.com server.sh[48460]: Stopping someservice - PID [48430]

Aug 30 09:36:21 whatever.domain.com systemd[1]: someservice.service: main process exited, code=exited, status=143/n/a

Aug 30 09:36:22 whatever.domain.com systemd[1]: someservice.service: control process exited, code=exited status=10

Aug 30 09:36:22 whatever.domain.com systemd[1]: Stopped Someservice.

Aug 30 09:36:22 whatever.domain.com systemd[1]: Unit someservice.service entered failed state.

Aug 30 09:36:22 whatever.domain.com systemd[1]: someservice.service failed.

从journalctl日志我可以看到systemctl首先返回status = 143然后我的返回值为10.所以我猜我的错误是在启动/停止脚本中的某处(因为错误代码143在函数返回0之前传递)?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Linux中的WiFi P2P链接,可以通过wpa_supplicant实现。下面是一个简单的示例代码,可以帮助你开始: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define BUFFER_SIZE 256 int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; char buffer[BUFFER_SIZE]; if (argc < 3) { fprintf(stderr,"usage %s hostname port\n", argv[0]); exit(0); } portno = atoi(argv[2]); sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,"ERROR, no such host\n"); exit(0); } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length); serv_addr.sin_port = htons(portno); if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) { perror("ERROR connecting"); exit(1); } while (1) { bzero(buffer, BUFFER_SIZE); printf("Please enter the message: "); fgets(buffer, BUFFER_SIZE, stdin); n = write(sockfd, buffer, strlen(buffer)); if (n < 0) { perror("ERROR writing to socket"); exit(1); } bzero(buffer, BUFFER_SIZE); n = read(sockfd, buffer, BUFFER_SIZE); if (n < 0) { perror("ERROR reading from socket"); exit(1); } printf("Server message: %s\n", buffer); } close(sockfd); return 0; } ``` 这个程序可以连接到一个指定的主机和端口,并在两者之间发送消息。你可以在Linux中使用wpa_supplicant来启用WiFi P2P,并在另一个设备上运行相同的程序。这样,你就可以在两个设备之间建立一个点对点的连接,并在它们之间传输数据了。 然而,堆栈内存溢出是一个常见的问题,可能会导致程序崩溃。为了避免这个问题,你可以使用动态内存分配,而不是使用堆栈。例如,你可以使用malloc()函数在堆上分配内存,而不是在栈上分配内存。这样,你就可以更好地控制你的内存使用情况,从而避免堆栈内存溢出

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值