远程执行命令不成功的问题

  当我们部署、维护多台主机的时候,通常需要通过程序远程执行一些命令,然而通常会发现在本地可正常执行的命令,远程调用时就会不正常。 这通常都是因为远程调用的运行方式为: 远程登录-》调用-》退出登录,在’退出‘时终端会收到 HUP(hangup)信号从而关闭其所有子进程(自然包含了我们’调用‘的命令)。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

1. nohup

顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。

一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。
nohup 示例
[[email protected] ~]# nohup ping www.baidu.com &
[1] 3059
nohup: appending output to `nohup.out‘
[[email protected] ~]# ps -ef |grep 3059
root      3059   984  0 21:06 pts/3    00:00:00 ping www.baidu.com
root      3067   984  0 21:06 pts/3    00:00:00 grep 3059
[[email protected] ~]#

2。setsid

  setsid可以让进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。

  setsid用法:

setsid --help

Usage:
setsid [options] <program> [arguments ...]

Options:
-c, --ctty set the controlling terminal to the current one
-h, --help display this help and exit
-V, --version output version information and exit

For more details see setsid(1).

可见 setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。

setsid 示例
[[email protected] ~]# setsid ping www.baidu.com
[[email protected] ~]# ps -ef |grep www.baidu.com
root     31094     1  0 07:28 ?        00:00:00 ping www.baidu.com
root     31102 29217  0 07:29 pts/4    00:00:00 grep www.baidu.com

值得注意的是,上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。

3。&

将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。所以这样也就能躲过 HUP 信号的影响了。

subshell 示例
[[email protected] ~]# (ping www.baidu.com &)
[[email protected] ~]# ps -ef |grep www.baidu.com
root     16270     1  0 14:13 pts/4    00:00:00 ping www.baidu.com
root     16278 15362  0 14:13 pts/4    00:00:00 grep www.baidu.com

从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。

时间: 2024-10-29 10:46:16

远程执行命令不成功的问题的相关文章

Zabbix远程执行命令

原文发表于cu:2016-06-14 Zabbix触发器(trigger)达到阀值后会有动作(action)执行:发送告警信息或执行远程命令. 本文主要配置验证zabbix执行远程命令. 一.环境 Server:基于CentOS-7-x86_64-1511: Zabbix:zabbix-3.0.1server/agent. 二.注意事项 一些能想到的比较重要的注意事项: 远程执行命令是server端向agent端执行,不支持主动模式的agent: 不支持代理模式: zabbix用户必须对命令具有

使用ansible远程执行命令

使用ansible远程执行命令 1.ansible简介 ansible的官方定义:"Ansible is Simple IT Automation"--简单的自动化IT工具.这个工具的目标: 自动化部署APP 自动化管理配置项 自动化的持续交付 自动化的(AWS)云服务管理. 其本质上就是在远程在多台服务器执行一系列命令和文件同步,和以前的介绍的使用并行ssh提高工作效率功能类似,他们都是使用ssh协议进行远程操作,但ansible比pssh功能更强大,比如支持主机列表分组.支持pla

Linux监控平台(主被动模式,添加监控主机,添加图形,处理图形乱码,远程执行命令)

一.主动模式和被动模式(针对客户端) 主动模式:客户端使用完数据后,每隔自定义事件主动上报给服务端 应用环境:当客户端数量非常多,建议使用主动模式,这样可以降低服务端的压力. 被动模式:服务端会主动连接客户端,客户端被动连接,把监控信息传递给服务端 应用环境:服务端有公网ip,客户端只有内网ip,但是能连接外网,可以主动上报. 这种场景适合主动模式. 二.添加监控主机 添加主机: 再添加主机之前,我们要先添加一个主机群组,在配置中 主机群组的右上角有一个创建主机 然后点主机,右上角有一个创建主机

expect脚本同步文件、指定host和要同步的文件、构建文件分发系统、批量远程执行命令

expect脚本同步文件 1.自动同步文件 [[email protected] shell]# vi 4.expect 增加如下脚本内容: #!/usr/bin/expect set passwd "123456" spawn rsync -av [email protected]:/tmp/12.txt /tmp/ expect { "yes/no" { send "yes\r"} "password:" { send &

expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

20.31 expect脚本同步文件#!/usr/bin/expectset passwd "liang.123"spawn rsync -av [email protected]:/tmp/12.txt /tmp/ 将远程的/tmp/12.txt同步到本地的机器上 expect {"yes/no" { send "yes\r"} 第一次会提示yes或no"password:" { send "$passwd\r&q

分发系统介绍,expect脚本远程登录,expect脚本远程执行命令,expect脚本传递参数

分发系统介绍 当我们要上线一个新代码的时候,如果机器少,我们的工作量不会很大,很容易完成,如果设备很多,有几十台,上百台的话,那我们的工作量会非常大,而且也不规范,这时,我们就可以用可以用开源的软件,expect脚本语言,进行实现分发系统的功能. expect脚本远程登录首先yum安装expectyum install -y expect 然后写一个expect的远程登录脚本#! /usr/bin/expectset host "192.168.133.132" 这是expect的变量

分发系统介绍,expect脚本远程登录, expect脚本远程执行命令, expect脚本传递参数

分发系统介绍 当我们要上线一个新代码的时候,如果机器少,我们的工作量不会很大,很容易完成,如果设备很多,有几十台,上百台的话,那我们的工作量会非常大,而且也不规范,这时,我们就可以用可以用开源的软件,expect脚本语言,进行实现分发系统的功能. expect脚本远程登录 首先yum安装expectyum install -y expect 然后写一个expect的远程登录脚本#! /usr/bin/expectset host "192.168.133.132" 这是expect的变

分发系统介绍 expect脚本远程登录 expect脚本远程执行命令 expect脚本传递参数

一.分发系统介绍场景:公司业务逐渐扩大,后端服务端使用的编程语言是PHP,要运行PHP的环境,需要配置LAMP或者LNMP环境,最后还需要把代码上传到服务器上去,但是业务在迭代,需要新增功能,一台机器还好,可以在机器上直接修改,但是这样做不规范,如果机器有几十台或者上百台机器都是这一个站点的,比如有一个接口,APP访问量很大,APP需要调用服务端的一个接口,假如这个接口有50台机器在承载,这时候,就需要做一个分发系统,能够把每天或者每一段时间更新的代码分别发发布到这50台机器上去,分发器其实就是

解决SSH远程执行命令找不到环境变量的问题

通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题.但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的.两种相似的方法,得到的结果却截然不同,看起来很诡异的现象,根本原因在于这两种方式使用的bash模式不同! 1. 通过SSH登录后再执行命令和脚本这种方式会使用Bash的interactive + login shell模式,这里面有两个概念需要解释:interactive和login. login故名思义,即登陆,login shell