killall -9 只杀父进程方式
时间: 2024-04-25 13:17:55 浏览: 155
killall -9命令是在Linux系统中用于终止进程的命令。使用killall -9命令时,-9参数表示强制终止进程,即无条件地终止进程,不给进程执行清理操作的机会。
当使用killall -9命令时,它会根据进程名字来终止所有匹配的进程,包括父进程和子进程。这种方式可能会导致一些问题,因为它会直接终止进程,而不会给进程执行清理操作的机会。这可能会导致数据丢失或者系统资源没有正确释放。
因此,建议在使用killall -9命令之前,先尝试使用kill命令发送SIGTERM信号给进程,让进程有机会进行清理操作。只有在无法通过正常方式终止进程时,才考虑使用killall -9命令。
相关问题
1. 安装nginx 2. 启动nginx nginx master --- nginx worker 3.先杀nginx子进程, 再杀nginx 父进程 4.先杀nginx 父进程, 再杀nginx子进程 5.分别用kill 和kill -9 做实验
安装Nginx通常是通过包管理器进行的,比如在Linux上,你可以用apt-get(Ubuntu/Debian)或yum(CentOS/RHEL):
1. **安装Nginx** (以Ubuntu为例):
```
sudo apt update
sudo apt install nginx
```
2. **启动Nginx**:
- 对于非root用户,可以使用`nginx`命令启动:
```
nginx
```
- 或者作为root权限,启动master和worker模式:
```
sudo service nginx start
```
在Debian系列系统中,可能会用到`sudo systemctl start nginx`。
3. **杀死子进程和父进程**:
- 如果你想先停止子进程(worker),你可以直接使用`killall nginx`,它会杀死所有匹配该命令名的进程。
- 杀死父进程(master)需要找到它的PID,一般不会直接显示出来,可以查看`ps aux | grep nginx`找出,然后用`kill PID`。例如,假设PID为`1234`,则:
```
kill 1234
```
注意:如果直接使用`kill -9`,无论子进程还是父进程,都会发送强制中断信号,可能导致数据丢失或未完成的任务。
4. **实验区别**:
- `kill`发送的是SIGTERM信号,给进程留出时间处理并关闭,通常用于优雅地终止进程。
- `kill -9`发送的是SIGKILL信号,不可阻挡,立即强制结束进程,无机会保存数据或清理资源,所以通常避免使用。
分别尝试这两种情况,你会看到`kill`可能导致Nginx逐步停止服务,而`kill -9`会导致Nginx立即停止但可能出现异常状态。
编写一个程序,使用系统调用shmget(), shmat(), shmdt(), shmctl()实现进程通过共享内存的通信:一个子进程SERVER将共享内存首字节置为-1,当首字节值不为-1时读取这个值并再次将其置为-1;另一个子进程CLIENT在首字节为-1时将首字节置为9-0中的一个数字。(SHMKEY取值75,共享区的长度取1024)
好的,下面是代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#define SHMKEY 75
#define SHMSIZE 1024
int main() {
int shmid;
char *shmaddr;
// 创建共享内存
if ((shmid = shmget(SHMKEY, SHMSIZE, IPC_CREAT | 0666)) == -1) {
perror("shmget");
exit(1);
}
// 映射共享内存到进程空间
if ((shmaddr = shmat(shmid, NULL, 0)) == (char *)-1) {
perror("shmat");
exit(1);
}
// 创建子进程1: SERVER
pid_t pid1 = fork();
if (pid1 == -1) {
perror("fork");
exit(1);
} else if (pid1 == 0) {
// 子进程1: SERVER
printf("SERVER: start\n");
*shmaddr = -1;
printf("SERVER: set value to %d\n", *shmaddr);
while (1) {
if (*shmaddr != -1) {
printf("SERVER: read value %d\n", *shmaddr);
*shmaddr = -1;
printf("SERVER: set value to %d\n", *shmaddr);
}
sleep(1);
}
} else {
// 创建子进程2: CLIENT
pid_t pid2 = fork();
if (pid2 == -1) {
perror("fork");
exit(1);
} else if (pid2 == 0) {
// 子进程2: CLIENT
printf("CLIENT: start\n");
while (*shmaddr != -1) {
sleep(1);
}
int num = rand() % 10;
*shmaddr = num;
printf("CLIENT: set value to %d\n", *shmaddr);
exit(0);
} else {
// 父进程等待两个子进程结束
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
// 删除共享内存
if (shmctl(shmid, IPC_RMID, NULL) == -1) {
perror("shmctl");
exit(1);
}
printf("Parent exit.\n");
}
}
// 解除共享内存映射
if (shmdt(shmaddr) == -1) {
perror("shmdt");
exit(1);
}
return 0;
}
```
这段代码中,我们首先使用 `shmget()` 创建了一个共享内存区域,然后使用 `shmat()` 将其映射到当前进程的地址空间中。接着,我们创建了两个子进程,一个是 SERVER 进程,它将共享内存首字节设置为 -1,并循环检查首字节是否被修改,如果被修改,则读取它的值,并将首字节再次设置为 -1;另一个是 CLIENT 进程,它在首字节为 -1 时将其设置为 0 到 9 中的一个数字。
在父进程中,我们使用 `waitpid()` 等待子进程结束,并在最后使用 `shmctl()` 删除共享内存区域。最后,我们使用 `shmdt()` 解除共享内存的映射。
注意,为了保证 SERVER 进程能够正常工作,我们需要让它一直运行,所以在这里我们使用了一个死循环。如果你想要结束这个程序,可以在终端中使用 `killall -9 程序名` 命令来杀死所有与该程序相关的进程。
阅读全文