站内公告:

我们的虚拟社区正式开通了

Main Menu

最新帖子

#51
PHP框架-Yii / 批量 request 请求
上次发布者 jvip_chen - 2022-5月-22 05:37 下午
可以使用 yii\httpclient\Client::batchSend() 方法同时发送多个请求:

use yii\httpclient\Client;

$client = new Client();

$requests = [
    $client->get('http://domain.com/keep-alive'),
    $client->post('http://domain.com/notify', ['userId' => 12]),
];
$responses = $client->batchSend($requests);
可使用特定的 传输方式 提升其性能。 在内置传输中,只有 yii\httpclient\CurlTransport 允许并行发送请求,从而减少程序执行时间。

注意:只有某些特定的传输传输方式可以使用 batchSend() 并行发送请求。 默认情况下,请求只是一个接一个地发送,没有任何错误或警告抛出。如果需要提升性能 ,则需为客户端配置正确的传输方式。

batchSend() 方法返回响应数组,这些键对应于请求数组中的键。 可以使用如下方式简化响应的处理:

use yii\httpclient\Client;

$client = new Client();

$requests = [
    'news' => $client->get('http://domain.com/news'),
    'friends' => $client->get('http://domain.com/user/friends', ['userId' => 12]),
    'newComment' => $client->post('http://domain.com/user/comments', ['userId' => 12, 'content' => 'New comment']),
];
$responses = $client->batchSend($requests);

// result of `GET http://domain.com/news` :
if ($responses['news']->isOk) {
    echo $responses['news']->content;
}

// result of `GET http://domain.com/user/friends` :
if ($responses['friends']->isOk) {
    echo $responses['friends']->content;
}

// result of `POST http://domain.com/user/comments` :
if ($responses['newComment']->isOk) {
    echo "Comment has been added successfully";
}
#52
PHP框架-Yii / Request 参数
上次发布者 jvip_chen - 2022-5月-22 05:36 下午
使用 yii\httpclient\Request::$options 来调整特定的请求。 支持以下参数:

  • timeout: integer, 允许执行请求的最大超时时间(秒)。
  • proxy: string, 指定代理服务器的地址的 URI。(例如 tcp://proxy.example.com:5100)
  • userAgent: string, 在 HTTP 请求中使用的 "User-Agent:" 标头的内容。
  • followLocation: boolean, 是否重定向至 HTTP 头信息中的任意 "Location:"。
  • maxRedirects: integer, 要跟踪的重定向的最大数量。
  • sslVerifyPeer: boolean, 是否启用 ssl 验证。
  • sslCafile: string, CA 证书在本地文件系统上的位置,应与 'sslVerifyPeer' 参数一起使用以验证服务端的身份。
  • sslCapath: string, 一个保存多个CA证书的目录。
例如:

use yii\httpclient\Client;

$client = new Client();

$response = $client->createRequest()
    ->setMethod('POST')
    ->setUrl('http://domain.com/api/1.0/users')
    ->setData(['name' => 'John Doe', 'email' => 'johndoe@domain.com'])
    ->setOptions([
        'proxy' => 'tcp://proxy.example.com:5100', // use a Proxy
        'timeout' => 5, // set timeout to 5 seconds for the case server is not responding
    ])
    ->send();
提示:可以通过 yii\httpclient\Client::$requestConfig 对默认请求进行设置。 可以使用 yii\httpclient\Request::addOptions() 在添加其他设置的同时保留原始的其他参数。

在使用 yii\httpclient\CurlTransport 时,可配置特殊的请求参数。 例如:指定 cUrl 请求的连接和接收数据的超时时间:

use yii\httpclient\Client;

$client = new Client([
    'transport' => 'yii\httpclient\CurlTransport' // only cURL supports the options we need
]);

$response = $client->createRequest()
    ->setMethod('POST')
    ->setUrl('http://domain.com/api/1.0/users')
    ->setData(['name' => 'John Doe', 'email' => 'johndoe@domain.com'])
    ->setOptions([
        CURLOPT_CONNECTTIMEOUT => 5, // connection timeout
        CURLOPT_TIMEOUT => 10, // data receiving timeout
    ])
    ->send();
有关特定参数支持的详细信息,请参阅特定的传输类文档。
#53
PHP 开发 / PHP——curl使用代理
上次发布者 jvip_chen - 2022-5月-22 04:08 下午
代码样例
使用代理

<?php
//要访问的目标页面
$page_url "http://dev.kdlapi.com/testproxy";

//代理ip,由快代理提供
$proxy "47.115.5.19";
$prod 16816;

$ch curl_init();
curl_setopt($chCURLOPT_URL$page_url);

curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);  
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE);

//设置代理
curl_setopt($chCURLOPT_PROXYTYPECURLPROXY_HTTP);
curl_setopt($chCURLOPT_PROXY$proxy);
curl_setopt($chCURLOPT_PROXYPORT$prod); 

//自定义header
$headers = array();
$headers[] = 'User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);';
curl_setopt($chCURLOPT_HTTPHEADER$headers);

//自定义cookie
curl_setopt($chCURLOPT_COOKIE,''); 

curl_setopt($chCURLOPT_ENCODING'gzip'); //使用gzip压缩传输数据让访问更快

curl_setopt($chCURLOPT_CONNECTTIMEOUT5);
curl_setopt($chCURLOPT_TIMEOUT10);

curl_setopt($chCURLOPT_HEADERtrue);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);

$result curl_exec($ch);
$info curl_getinfo($ch);
curl_close($ch);

echo 
$result;
echo 
"\n\nfetch ".$info['url']."\ntimeuse: ".$info['total_time']."s\n\n";
?>
运行下
php curl.php
#54
Linux 系统 / Supervisor使用详解
上次发布者 cloud - 2022-5月-15 10:33 下午
一、supervisor简介
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

注:本文以centos7为例,supervisor版本3.4.0。

二、supervisor安装
配置好yum源后,可以直接安装
yum install supervisor
Debian/Ubuntu可通过apt安装
apt-get install supervisor
pip安装
pip install supervisor
easy_install安装
easy_install supervisor
三、supervisor使用
supervisor配置文件:/etc/supervisord.conf
注:supervisor的配置文件默认是不全的,不过在大部分默认的情况下,上面说的基本功能已经满足。

子进程配置文件路径:/etc/supervisord.d/
注:默认子进程配置文件为ini格式,可在supervisor主配置文件中修改。

四、配置文件说明
supervisor.conf配置文件说明:
[unix_http_server]
file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ;socket文件的mode,默认是0700
;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid
 
;[inet_http_server]         ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user              ;登录管理后台的用户名
;password=123               ;登录管理后台的密码
 
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ;可以打开的进程数的最小值,默认 200
 
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
 
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
autostart=true       ; 在supervisord启动的时候也自动启动
startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3       ; 启动失败自动重试次数,默认是3
user=tomcat          ; 用哪个用户启动进程,默认是root
priority=999         ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程
 
;包含其它配置文件
[include]
files = relative/directory/*.ini    ;可以指定一个或多个以.ini结束的配置文件
子进程配置文件说明:
给需要管理的子进程(程序)编写一个配置文件,放在/etc/supervisor.d/目录下,以.ini作为扩展名(每个进程的配置文件都可以单独分拆也可以把相关的脚本放一起)。如任意定义一个和脚本相关的项目名称的选项组(/etc/supervisord.d/test.conf):
#项目名
[program:blog]
#脚本目录
directory=/opt/bin
#脚本执行命令
command=/usr/bin/python /opt/bin/test.py

#supervisor启动的时候是否随着同时启动,默认True
autostart=true
#当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的
autorestart=false
#这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1

#脚本运行的用户身份
user = test

#日志输出
stderr_logfile=/tmp/blog_stderr.log
stdout_logfile=/tmp/blog_stdout.log
#把stderr重定向到stdout,默认 false
redirect_stderr = true
#stdout日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20MB
#stdout日志文件备份数
stdout_logfile_backups = 20
子进程配置示例:
#说明同上
[program:test]
directory=/opt/bin
command=/opt/bin/test
autostart=true
autorestart=false
stderr_logfile=/tmp/test_stderr.log
stdout_logfile=/tmp/test_stdout.log
#user = test 
五、supervisor命令说明
常用命令
supervisorctl status        //查看所有进程的状态
supervisorctl stop es       //停止es
supervisorctl start es      //启动es
supervisorctl restart       //重启es
supervisorctl update        //配置文件修改后使用该命令加载新的配置
supervisorctl reload        //重新启动配置中的所有程序
注:把es换成all可以管理配置中的所有进程。直接输入supervisorctl进入supervisorctl的shell交互界面,此时上面的命令不带supervisorctl可直接使用。

注意事项
使用supervisor进程管理命令之前先启动supervisord,否则程序报错。
使用命令supervisord -c /etc/supervisord.conf启动。
若是centos7:
systemctl start supervisord.service     //启动supervisor并加载默认配置文件
systemctl enable supervisord.service    //将supervisor加入开机启动项
常见问题
unix:///var/run/supervisor.sock no such file
问题描述:安装好supervisor没有开启服务直接使用supervisorctl报的错
解决办法:supervisord -c /etc/supervisord.conf

command中指定的进程已经起来,但supervisor还不断重启
问题描述:command中启动方式为后台启动,导致识别不到pid,然后不断重启,这里使用的是elasticsearch,command指定的是$path/bin/elasticsearch -d
解决办法:supervisor无法检测后台启动进程的pid,而supervisor本身就是后台启动守护进程,因此不用担心这个

启动了多个supervisord服务,导致无法正常关闭服务
问题描述:在运行supervisord -c /etc/supervisord.conf之前,直接运行过supervisord -c /etc/supervisord.d/xx.conf导致有些进程被多个superviord管理,无法正常关闭进程。
解决办法:使用ps -fe | grep supervisord查看所有启动过的supervisord服务,kill相关的进程。

#55
Ubuntu / Ubuntu操作-04 SUDO设置
上次发布者 jvip_chen - 2022-5月-09 03:02 下午
在sudo于1980年前后被写出之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码,而sudo使一般用户不需要知道超级用户的密码即可获得权限。

1 授权普通用户执行root指令
授权普通用户执行root指令,就需要在/etc/sudoers文件中进行配置(或者直接使用visudo命令,不过只能在root用户下执行):

[root@test-huanqiu ~]# visudo
.....
# User privilege specification
pang ALL=(ALL) ALL

1.1 参数解释
第一个字段zhangj指定的是用户:可以是用户名,也可以是别名。每个用户设置一行,多个用户设置多行,也可以将多个用户设置成一个别名后再进行设置。
第二个字段ALL指定的是用户所在的主机:可以是ip,也可以是主机名,表示这个sudo设置后的文件即/etc/sudoers只在这个主机上生效,ALL表示在所有主机上都生效!限制的一般都是本机,也就是限制使用这个文件的主机;如果指定为"192.168.1.88"表示这个文件只有在这台主机上生效,如果拷贝到别的机子上是不起作用的!一般都指定为"ALL"表示所有的主机,不管文件拷到那里都可以用。
第三个字段(ALL)括号里指定的也是用户:指定以什么用户身份执行sudo,即使用sudo后可以享有所有账号下的权限。如果要排除个别用户,可以在括号内设置,比如ALL=(ALL,!root,!ops)。也可以设置别名
第四个字段ALL指定的是执行的命令:即使用sudo后可以执行所有的命令。也可以设置别名。NOPASSWD: ALL表示使用sudo的不需要输入密码。这里指令要用绝对路径
1.2 示例
如果我们想让用户pang只能在本主机(主机名为localhost)以root账户执行/bin/chown、/bin/chmod 两条命令,那么就应该这样配置:

[root@test-huanqiu ~]# visudo
.......
# User privilege specification
pang localhost=(root) /bin/chown,/bin/chmod

如果用户pang登录之后运行sudo命令,不满足上面三个条件之一的操作都将失败。

2 免密操作
安全是安全了,但很麻烦,每次执行指令都要输入密码,若要消除密码输入操作,修改配置文件:

2.1 使用root用户 visudo
#这里的NOPASSWD就是配置支持免密执行的字段
pang       ALL=(root)      NOPASSWD:/usr/bin/vim     
       

这里设置的是vim指令能够无密码执行!

2.2 手工修改/etc/sudoers文件
# 切换至root用户
sudo su - root
# 修改/etc/sudoers文件权限
chmod 744 /etc/sudoers
# 修改/etc/sudoers文件,添加如下内容,ubuntu为当前用户
ubuntu    ALL=(ALL:ALL) NOPASSWD:ALL
# 保存,并恢复权限
chmod 440 /etc/sudoers
# 重启系统
reboot
新启动一个terminal, 测试没有生效。
原因: 设了nopasswd,但是不起作用,原因是被后面的group的设置覆盖了。改为添加在文件最后一行即可。
# User privilege specification
root ALL=(ALL:ALL) ALL
pang ALL=(ALL:ALL) NOPASSWD:ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
pang    ALL=(ALL:ALL) NOPASSWD:ALL

3 授权给用户组
[root@test-huanqiu ~]# visudo
.....
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move it further down)
%sudo ALL=(ALL) ALL
和授权给单个用户类似,只不过将用户名在这里换成%组名,所有在该组中的用户都按照此规则进行授权。

对于该例,所有在sudo组内的用户都有在任何终端(第一个ALL)、以任何用户(第二个ALL)、执行任何命令(第三个ALL)的权限,查看/etc/group文件可以知道哪些用户属于 sudo组。

4 操作技巧
4.1 执行root命令忘记加sudo:
输入一个长长的命令,按Enter之后出现无权限操作,因为在命令前面忘记加sudo了。
大多人的做法是按 ↑ 回到上一条命令,在该命令之前加上sudo,再执行该命令。
其实,也大可不必这样,巧妙的做法是:
只要输入 sudo !! 即可,这里的 !! 代表上一条命令。如:

[pang@localhost ~]$ cat test
cat: test: Permission denied
[pang@localhost ~]$ sudo !!
sudo cat test
lala
xiixixi'
nihao

即拿到了test文件的内容!

4.2 shell内置命令无法使用sudo
shell是一个交互式的应用程序,在执行外部命令时通过fork来创建一个子进程,再通过exec来加载外部命令的程序来执行。
但是如果一个命令是shell内置命令,那么只能直接由shell 来运行。
sudo 的意思是,以别的用户(如root)的权限来fork一个进程,加载程序并运行,因此sudo后面不能跟shell 的内置命令。\

[pang@localhost ~]$ sudo cd /sys/kernel/debug/
sudo: cd: command not found

此时应使用:

[pang@localhost ~]$ sudo bash   //或者sudo su - 或者 sudo -s,其实就使用sudo命令从当前用户切换到root用户
[root@localhost debug]# cd /sys/kernel/debug/
[root@localhost debug]#
4.3 sudo操作记入日志
作为一个Linux系统的管理员,不仅可以让指定的用户或用户组作为root用户或其它用户来运行某些命令,还能将指定的用户所输入的命令和参数作详细的记录。
而sudo的日志功能就可以用户跟踪用户输入的命令,这不仅能增进系统的安全性,还能用来进行故障检修。

创建sudo日志文件
[pang@localhost ~]$ sudo touch /var/log/sudo.log
修改/etc/rsyslog.conf配置文件(有些版本系统的这个文件名为/etc/syslog.conf),在该文件加入下面一行
[pang@localhost ~]$ sudo vim /etc/rsyslog.conf
.........
local2.debug /var/log/sudo.log //空白不能用空格,必须用tab

修改/etc/sudoers 配置文件
[pang@localhost ~]$ sudo vim /etc/sudoers
........
Defaults logfile=/var/log/sudo.log
重启 syslog 服务
[pang@localhost ~]$ sudo service rsyslog restart
验证
经过上面的配置,sudo的所有成功和不成功的sudo命令都记录到文件/var/log/sudo.log 中。
4.4 为多个用户分配不同的组:
在root用户的情况下,编辑/etc/group文件,这个文件就是控制系统的组和用户所属组情况的。

groupadd sudo                 #因为没有指定gid,所以就按着文件中的gid往后推的
sudo:x:504:                    #添加完之后在该文件中就出现了这条字段。

修改为:

sudo:x:504:batman,test            #此时,用户batman和test的附属组就是sudo了
此时再visudo

%sudo   ALL=(root)      NOPASSWD:/usr/bin/vim
%sudo   ALL=(root)      NOPASSWD:/bin/cat

保存退出,可以用:visudo -c来检查语法,返回OK,没问题。
检测:

-rw-------. 1 root root 1595 Jul 24 05:00 rsyncd.conf
-rw-------. 1 root root    8 Jul 24 05:00 rsyncd.pass
-rw-------. 1 root root   14 Jul 24 05:00 rsyncd.pwd

这三个文件,只有root有操作权限,现在

[pang@localhost]$ sudo vim rsyncd.conf
发现也是ok的。

5 sudo问题记录
手工修改/etc/sudoers时,如果不注意操作会导致一些问题产生,特此记录。

5.1 错误修改/etc/sudoers所属用户后恢复
在修改设置sudo免密码时,无意将chmod 440 /etc/sudoers改为了chown 440 /etc/sudoers后,导致系统重启后无法使用sudo命令。

解决方法:

(1) 重启电脑,进入ubuntu 恢复模式Grub(一直按esc或shift)
(2) 在Grub的菜单中选择root
(3) 重新输入命令 chown root /etc/sudoers
(4) reboot
#56
Ubuntu / 通过PHP执行系统命令
上次发布者 jvip_chen - 2022-5月-09 02:56 下午
PS.这几天用PHP写了一个小工具,因为要部署在Linux,又要暂时使用sudo执行一些Shell命令,网上也有很多资料,但是有的要么就直接把Web服务器用户直接提升权限,要么就使用密码存文件方式,安全性都不是特别好,好在搜索到在Wordpress上一位外国友人的文章,很实用,安全性也不错,就把它翻译过来和大家分享一下,下面是正文部分。

  许多时候我们需要在Linux系统上执行系统命令--比如来删除一个目录或者重启服务。但是,因为Apache并不是以root权限运行的,这样使用PHP的exec()、system()或者passthru()函数来实现以上功能就变得不太可能。

  解决这个问题的方案是非常简单的,特别是在Ubuntu上。Apache的用户www-data需要获得权限来使用sudo执行一些应用。

  1、执行命令

command sudo visudo
  2、在文件末尾,增加如下内容

www-data ALL=NOPASSWD: /sbin/iptables, /usr/bin/du
  假设你希望使用超级用户(root)权限运行iptables和du命令。但是,如果你想使用超级用户权限运行每一个应用,添加以下命令来代替上面的命令。 

www-data ALL=NOPASSWD: ALL
  3、就是这样,现在像下面这种方式在你的php脚本中使用exec()函数

exec("sudo iptables -P FORWARD ACCEPT");
  这使我能够在服务器上执行脚本,这个脚本我早先不得不使用setuid和联合是否为cron的方式。但是现在,PHP使这变得方便。
PS.

1、修改sudoers还有另外一种方式,使用 vi /etc/sudoers,在此之前要 sudo chmod u+w /etc/sudoers,获取权限。

2、如果要让PHP运行我们自己写的脚本,我在Google上看到用这个方法也是可以的。例如:www-data ALL=NOPASSWD: /tmp/script.sh

     要写明sh文件的具体位置
#57
Redis数据库 / 查看redis cluster集群信息
上次发布者 jvip_chen - 2022-5月-09 01:49 下午
注:ip为安装redis的那台服务器(集群中的其中一台)的ip,password为redis的密码

1. 集群相关信息查看
1.集群状态
redis-cli -h ip -p 6401 -a password cluster info<br>
2.集群节点信息
redis-cli -h ip -p 6401 -a password cluster nodes<br>
3.节点内存、cpu、key数量等信息(每个节点都需查看)
redis-cli -h ip -p 6401 -a password info<br>
4.从redis集群中查看key(只需要连接master节点查看)
a.查看该节点的所有key
redis-cli -h ip -p 6401 -a password keys *<br>
b.查看key的value值
redis-cli -h ip -p 6401 -a password -c get key<br>
c.查看key值得有效期
redis-cli -h ip -p 6401 -a password -c ttl key
  

2.查看 redis 中存的数据
ssh root@ip
Password: password
keys *
查看存储的数据剩余过期时间
ttl key<br>
查看key的类型(string,set,list,hash)
type key<br>
查看key的值(string类型)
get key<br>
查看key的值(set类型)
scard key //获取 set 集合中元素的数量
smembers key //查看 set 中的内容<br>
查看key的值(hash类型)
hlen key //获取 key 键的字段数量
hgetall key //返回 key 键的所有字段及其值
hkeys key //获取 key 键中所有字段的名字
hvals key //获取 key 键中所有字段的值
#58
Shell脚本 / Linux nohup 命令
上次发布者 jvip_chen - 2022-5月-09 01:46 下午
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

使用权限
所有使用者

语法格式
nohup Command [ Arg ... ] [ & ]
参数说明:
Command:要执行的命令。

Arg:一些参数,可以指定输出文件。

&:让命令在后台执行,终端退出后命令仍旧执行。

实例
以下命令在后台执行 root 目录下的 runoob.sh 脚本:

nohup /root/runoob.sh &
在终端如果看到以下输出说明运行成功:

appending output to nohup.out
这时我们打开 root 目录 可以看到生成了 nohup.out 文件。

如果要停止运行,你需要使用以下命令查找到 nohup 运行脚本到 PID,然后使用 kill 命令来删除:

ps -aux | grep "runoob.sh"
参数说明:

a : 显示所有程序
u : 以用户为主的格式来显示
x : 显示所有程序,不区分终端机
另外也可以使用 ps -def | grep "runoob.sh" 命令来查找。

找到 PID 后,就可以使用 kill PID 来删除。

kill -9  进程号PID
以下命令在后台执行 root 目录下的 runoob.sh 脚本,并重定向输入到 runoob.log 文件:

nohup /root/runoob.sh > runoob.log 2>&1 &
2>&1 解释:

将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。

0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)
#59
服务器运维 / supervisor使用
上次发布者 jvip_chen - 2022-5月-06 02:43 下午
安装
# 安装 epel 源,如果此前安装过,此步骤跳过
yum install -y epel-release
yum install -y supervisor
systemctl enable supervisord # 开机自启动
systemctl start supervisord # 启动supervisord服务
# systemctl status supervisord # 查看supervisord服务状态
supervisord
运行supervisor时会启动一个进程supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启

systemctl restart supervisord
supervisorctl (命令管理工具)
可以用来执行start、stop、restart等命令,来对这些子进程进行管理

# 启动 hyperf 应用
supervisorctl start hyperf
# 重启 hyperf 应用
supervisorctl restart hyperf
# 停止 hyperf 应用
supervisorctl stop hyperf
# 查看所有被管理项目运行状态
supervisorctl status
# 重新加载配置文件
supervisorctl update
# 重新启动所有程序
supervisorctl reload
网页管理
supervisor提供了基于web的控制,管理员可以通过在页面上点点按钮即可完成对进程的启动、重启以及查看状态等操作,甚是方便

vim /etc/supervisor.conf

[inet_http_server]
port=127.0.0.1:9001
;username=test
;password=123456
systemctl start supervisord
# sudo /usr/bin/supervisord -n -c /etc/supervisord.conf
打开浏览器,输入地址127.0.0.1:9001
#60
服务器运维 / supervisorctl常用指令
上次发布者 jvip_chen - 2022-5月-06 02:41 下午
查看帮助
help
help <action>

关闭supervisord
shutdown
重载配置文件并重启supervisord和program
reload
读取当前运行配置和program配置文件的差异
reread
重载配置文件并重启受影响的program
update
重启program(不会重载配置文件)
restart <name>
restart <name> <name>
restart all

清空program日志
clear <name>
clear <name> <name>
clear all

前台显示program(Ctrl+C退出)
fg <name>
显示supervisord或program ID
pid
pid <name>
pid all

启动program
start <name>
start <name> <name>
start all
停止program
stop <name>
stop <name> <name>
stop all

查看program状态
status <name>
status <name> <name>
status

输出program最新日志(默认stdout,Ctrl+C退出)
tail [-f] <name> [stdout|stderr] (default stdout)
输出supervisord最新日志(Ctrl+C退出)
maintail [-f]