c - 如何使用简单的 Daemon C 代码在 Ubuntu 16.10 中启动 systemctl 服务
问题描述
我写简单的 C 代码
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/stat.h>
int main(){
pid_t pid;
pid=fork();
if(pid>0){
exit(1);
}
FILE *fp;
fp=fopen("pid.pid","a");
fprintf(fp,"%d",getpid());
fclose(fp);
printf("\npid = %d\n",pid);
printf("\ngetpid = %d\n",getpid());
puts("\nAfter fclose() \n");
umask(0);
while(1){}
return 0;
}
和 Daemon1.service
[Units]
Description=Socket programming with Daemon
[Service]
User=root
Type=forking
WorkingDirectory=/Omkar/Doc/systemctl/
ExecStart=/Omkar/Doc/systemctl/main
Restart=always
PIDFile=/Omkar/Doc/systemctl/pid.pid
[Install]
WantedBy=multi-user.target
并存储在位置
/etc/systemd/系统
在此之后我运行命令
systemctl 守护进程重载
systemctl enable Daemon1.service
systemctl 启动 Daemon1.service
然后我得到了错误
Daemon1.service 的作业失败,因为控制进程以错误代码退出。
有关详细信息,请参阅“systemctl status Daemon1.service”和“journalctl-xe”。
然后我用这个命令检查服务状态
systemctl status Daemon1.service
然后我得到了这个
● Daemon1.service
Loaded: loaded (/etc/systemd/system/Daemon1.service; enabled; vendor preset: enabled)
Active: failed (Result: start-limit-hit) since Tue 2019-11-19 18:21:26 IST; 3min 26s ago
Process: 5868 ExecStart=/Omkar/Doc/systemctl/main (code=exited, status=1/FAILURE)
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Failed to start Daemon1.service.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Daemon1.service: Unit entered failed state.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Daemon1.service: Failed with result 'exit-code'.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Daemon1.service: Service hold-off time over, scheduling restart.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Stopped Daemon1.service.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Daemon1.service: Start request repeated too quickly.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Failed to start Daemon1.service.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Daemon1.service: Unit entered failed state.
Nov 19 18:21:26 pt32-H81M-S systemd[1]: Daemon1.service: Failed with result 'start-limit-hit'.
我的服务没有运行。我应该改变什么,这样我的代码才能工作。我将 C 代码的可执行文件提供给Daemon1.service中的ExecStart =
解决方案
你的输出中有一行给你一个不那么微妙的提示:(code=exited, status=1/FAILURE)
● Daemon1.service
Loaded: loaded (/etc/systemd/system/Daemon1.service; enabled; vendor preset: enabled)
Active: failed (Result: start-limit-hit) since Tue 2019-11-19 18:21:26 IST; 3min 26s ago
Process: 5868 ExecStart=/Omkar/Doc/systemctl/main (code=exited, status=1/FAILURE)
修改你的代码在分叉后返回 0 而不是 1 给操作系统。
if(pid>0){
exit(0);
}
在进行了小幅调整后,您应该重新开始工作以继续前进:
# systemctl status Daemon1.service
● Daemon1.service
Loaded: loaded (/etc/systemd/system/Daemon1.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-11-19 08:49:33 CST; 5s ago
Process: 20484 ExecStart=/root/stackoverflow/Daemon1 (code=exited, status=0/SUCCESS)
Main PID: 20486 (Daemon1)
CGroup: /system.slice/Daemon1.service
└─20486 /root/stackoverflow/Daemon1
Nov 19 08:49:33 lm systemd[1]: Starting Daemon1.service...
Nov 19 08:49:33 lm systemd[1]: Started Daemon1.service.
推荐阅读
- node.js - 使用 mongoose 连接到现有集合
- c++ - 当必须转换类型时,通过 const 引用传递是否真的节省了内存成本?
- solr - SOLR:要进行拼写检查/同义化的最小标记大小
- php - php如何找到一组禁用日期中不存在的最接近今天的未来日期
- scala - 如何在scala中自动重新运行sbt项目
- web-services - 使用 API 查询克服长查询 URL 限制的替代方法 (GET /entities?q=longqueryparams)
- tensorflow2.0 - Keras-tuner:我如何在 Tuner.search 中使用 loss 和 val_loss 之间的加权平均数来实现目标?
- linux - 为什么 mawk 的输出(STDOUT)即使是终端也会被缓冲?
- r - R基本情节图例相互书写
- excel - 将一个单元格范围设置为等于另一个单元格而不丢失当前选择