ubuntu 启动GNOME设置守护进程时出错 解决办法

本文介绍了解决GNOME设置守护进程启动失败的问题。通过调整网络配置文件并重启网络服务,最终解决了登录后出现的错误提示,使系统恢复正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

启动并在用户登录后,即弹出出错信息:
启动GNOME设置守护进程时出错
主题、声音或者背景设置等可能不会正常工作。
最后的错误信息是:
Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

GNOME在您下次登录时仍将试图重启动设置守护进程
    询问之下,是在修改系统配置后开始出现的。等待足够长世间后,可以打开浏览器,但是想打开菜单,就会又得再等足够长的世间,才能继续操作。想打开网络设置,试了很久,也等了很久,都没有成功,看来想在图形界面下完成排错,是不行了。
    而且,在图形界面下,几乎无法打开一个终端。

    于是想到使用控制台1到6来进入,这总该可以吧,必经是linux呀!于是进行了如下操作后,顺利解决问题。

    1、ctrl+alt+F1 (也可以选择F2~6,但是7及以上不行,为什么?linux的常识呀!)进入控制台1.
    2、正常登录,并进入。
    3、sudo vim /etc/network/interfaces
    4、修改为如下:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0            ←路由器,当然使用dhcp了,让路由器给你个内网地址,比设置为固定的要来得方便些,不是吗?
        相信如下的配置,能够解决大多数人出现的网络配置问题。对于熟悉这方面配置及有特殊需要的人,可以相应进行变通予以解决:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0                                             ## 这个应该是决定是否启用这个端口
iface eth0 inet static                             ## 静态设置IP
#hwaddress ether 52:54:xx:51:xx:xx        ## 加入MAC地址,记得用就放在IP地址之前
address 192.168.1.XXX                                 ## 自己的IP地址,要填写对呀。
netmask 255.255.255.0
#broadcast 192.168.1..255                           ## 我一般是不用广播地址的。
#network 192.168.1.0                                 ## 我一般不启用
gateway 192.168.1.1                                      ## 注意网关应该依据实际情况予以填写。
5、esc键后,:wq! 保存退出。
6、sudo /etc/init.d/networking restart   重新启动网络服务;
7、ctrl+alt+F7,回到图形界面上来,再ctrl+alt+backspace,重新启动桌面管理器,呵呵,出错对话框已经不出现了,随后发现,问题已经排除。

ps:如果上面的办法还没有得到你要的结果,那么可以用以下方法

在终端下输入:sudo vim login.sh
其内容为:
#!/bin/bash
sudo /etc/init.d/networking restart
而后保存退出。

同理
在终端下输入:sudo vim logou.sh
其内容为:
#!/bin/bash
sudo ifdown eth0
而后保存退出。

修改两个文件的属性为可执行
在终端下输入:
chmod a+x login.sh
chmod a+x logout.sh

而后下次每次起动后在终端下运行一下login.sh
运行方法为在终端下输入:./login.sh
在每次注销的时候运行一下logou.sh,方法同上。
在重启的时候不用运行logou.sh

也可以不用制作 bash文件,只须在每次启动后在终端输入
:sudo /etc/init.d/networking restart
在每次注销的时候输入:sudo ifdown eth0 即可

ps2:
sudo ifdown eth0
sudo ifup eth0
上面两句话的作用和:sudo /etc/init.d/networking restart 是一样的。
<think>在Linux中,要编写一个程序,在shell界面下运行后会弹出新的shell界面(即启动一个新的shell会话),我们可以使用几种方法。这里我提供两种常见的方法: 1. 使用C语言编写,调用`fork()`和`exec()`系列函数来启动一个新的shell。 2. 使用脚本(如bash脚本)来启动一个新的shell。 但是,根据问题要求,我们需要编写一个程序。这里我使用C语言来实现,因为这样更接近系统编程。 ### 方法1:C语言程序 我们将编写一个C程序,该程序将创建一个子进程,并在子进程中执行一个新的shell(比如`/bin/bash`)。 代码示例: ```c #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { pid_t pid = fork(); if (pid == -1) { perror("fork failed"); return 1; } else if (pid == 0) { // 子进程 // 使用exec系列函数启动新的shell execl("/bin/bash", "bash", (char *)NULL); // 如果execl返回,说明调用失败 perror("execl failed"); return 1; } else { // 父进程 // 等待子进程结束 waitpid(pid, NULL, 0); } return 0; } ``` ### 解释: 1. **`fork()`**: 创建一个新的进程(子进程),该进程是父进程的一个副本。在子进程中,`fork()`返回0;在父进程中,返回子进程的PID。如果出错,返回-1。 2. **`execl()`**: 在子进程中,我们使用`execl()`来加载并执行一个新的程序。这里我们指定了`/bin/bash`作为要执行的程序,并传递参数`"bash"`作为程序名(即argv[0]),然后以`(char *)NULL`结束参数列表。 3. **`waitpid()`**: 父进程调用`waitpid()`等待子进程结束,避免产生僵尸进程。 编译并运行这个程序,它会启动一个新的bash shell。但是,请注意,这个新的shell是运行在同一个终端中的,它会替代当前的子进程。如果你希望在新的终端窗口中打开,那么需要根据你使用的桌面环境(如GNOME、KDE等)使用不同的命令(例如`gnome-terminal`、`xterm`等)。但问题要求是“弹出新的shell界面”,如果是在图形界面下,可能需要启动一个新的终端窗口。 ### 方法2:启动一个新的终端窗口 如果你希望在新的终端窗口中打开shell,那么可以使用系统命令来启动一个终端模拟器。例如,在Ubuntu上,我们可以使用`gnome-terminal`命令。但是,请注意,这种方法依赖于具体的桌面环境。 以下是一个C程序示例,它启动一个新的终端窗口(例如gnome-terminal): ```c #include <stdio.h> #include <unistd.h> int main() { // 使用execlp执行gnome-terminal命令 execlp("gnome-terminal", "gnome-terminal", "--", "bash", (char *)NULL); // 如果execlp返回,说明调用失败 perror("execlp failed"); return 1; } ``` ### 解释: 1. 这个程序直接使用`execlp`来执行`gnome-terminal`命令。`execlp`函数会在系统的PATH环境变量中查找可执行文件。 2. 参数`"--"`用于分隔选项和命令,然后我们传递`"bash"`作为在终端中要运行的命令(即启动bash shell)。 3. 如果系统上没有`gnome-terminal`,你可以替换为其他终端模拟器,如`xterm`、`konsole`等。 例如,使用`xterm`: ```c execlp("xterm", "xterm", "-e", "bash", (char *)NULL); ``` ### 注意: - 第二种方法需要你的系统安装了相应的终端模拟器。 - 在非图形界面(如纯命令行环境)中,第二种方法可能无法工作。 ### 运行 将上述代码保存为文件(比如`new_shell.c`),然后编译运行: ```bash gcc new_shell.c -o new_shell ./new_shell ``` ### 其他方法:使用脚本 实际上,如果只是简单地启动一个新的shell,我们可以写一个bash脚本: ```bash #!/bin/bash bash # 或者直接执行/bin/bash ``` 但这样不会打开新的终端窗口,而是在当前终端启动一个子shell。 如果要打开新的终端窗口,脚本可以这样写(针对gnome-terminal): ```bash #!/bin/bash gnome-terminal -- bash -c 'bash; exec bash' ``` ### 最后 根据你的需求选择合适的方法。如果是在图形界面下想要弹出新的终端窗口,建议使用第二种方法(调用终端模拟器)。如果是在命令行环境下,第一种方法即可。 §§相关问题§§: 1. 如何在Linux中使用C语言创建一个守护进程? 2. 解释一下`fork()`和`exec()`函数族的作用和区别。 3. 在Linux中,如何实现一个程序,使其在后台运行并脱离终端? 4. 使用Python如何实现打开一个新的终端窗口并运行命令?</think>在 Linux 中,编写一个程序在 shell 界面下运行后会弹出新的 shell 界面,可以通过创建子进程并执行新的 shell 程序来实现。以下是使用 C 语言的实现方案: ### 解决方案:使用 fork() 和 exec() 系统调用 ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid = fork(); // 创建子进程 if (pid < 0) { // fork 失败 perror("fork failed"); exit(EXIT_FAILURE); } else if (pid == 0) { // 子进程代码 printf("Launching new shell...\n"); // 使用 exec 系列函数启动新的 shell char *args[] = {"bash", NULL}; // 使用 bash 作为新 shell execvp(args[0], args); // 如果 execvp 成功,以下代码不会执行 perror("execvp failed"); exit(EXIT_FAILURE); } else { // 父进程代码 wait(NULL); // 等待子进程结束 printf("New shell session terminated.\n"); } return 0; } ``` ### 代码解释: 1. **`fork()` 系统调用**: - 创建当前进程的副本(子进程) - 在父进程中返回子进程的 PID - 在子进程中返回 0 - 出错返回 -1 2. **子进程处理**: - 使用 `execvp()` 替换当前进程映像为新的 shell 程序 - `execvp("bash", args)` 会查找 PATH 中的 `bash` 可执行文件 - 成功执行后,子进程将完全被新的 bash 进程替代 3. **父进程处理**: - 使用 `wait(NULL)` 等待子进程结束 - 当用户退出新 shell ,父进程会继续执行 ### 编译与运行: 1. 将代码保存为 `new_shell.c` 2. 编译:`gcc new_shell.c -o new_shell` 3. 运行:`./new_shell` ### 运行效果: ``` $ ./new_shell Launching new shell... user@host:~$ ← 这是新启动的 bash shell user@host:~$ exit ← 输入 exit 退出 exit New shell session terminated. $ ← 回到原来的 shell ``` ### 自定义 shell 类型: 如果想使用其他 shell(如 zsh 或 sh),修改 `args` 数组即可: ```c // 使用 zsh char *args[] = {"zsh", NULL}; // 使用系统默认 shell char *args[] = {getenv("SHELL"), NULL}; // 需要检查 NULL ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值