一、前言

国庆期间,服务器断电了,导致服务器上面数据库等应用全部关闭了,但是启动应用时候需要切换到对应的用户,让同事启动,又存在各种应用比较麻烦,个人应用也没有提前编写维护手册,导致服务关闭了好几天。为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户, 然后执行对应的应用脚本。这篇文章我只演示怎么用shell脚本切换到其他用户执行命令,同时在编写过程中用到了其他命令,也总结了使用方法。

二、脚本编写

2.1 执行命令代码段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh

su - mysql <<EOF
echo "mysql-----------------"
pwd;
echo "mysql-----------------"
exit
EOF

su - wno704 <<EOF
echo "wno704-----------------"
pwd;
echo "wno704-----------------"
exit
EOF

输出结果为:

mysql-----------------
/home/mysql
mysql-----------------
wno704-----------------
/home/wno704
wno704-----------------

2.2 执行单个命令

语法:su - 用户 -c "命令"

示例:

1
su - mysql -c "service mysql  start"

2.3 执行批量命令

语法:su - 用户 -s /bin/sh shell脚本

示例:

1
su - wno704 -s /bin/sh /opt/soft/wno704/start.sh

三、nohup命令使用

3.1 介绍

nohup 是 no hang up 的缩写,就是不挂断的意思。nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

3.2 使用场景

如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。

3.3 使用

在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中。如果在我们上面shell脚本中切换用户,那么这个命令,则会在命名的统计目录中生成nohup.out文件。为了解决这种问题,我们需要对文件输出进行重定向。

案例一

1
nohup command > myout.file 2>&1 &

在上面的例子中,

1
2
3
0 – stdin (standard input)
1 – stdout (standard output)
2 – stderr (standard error)

2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到myout.file文件中。

案例二

1
su - test -c "nohup  /opt/test/run.sh > /opt/test/nohup.out &"

这个例子是在脚本执行中将test用户的run.sh执行结果输出到脚本执行的平级目录中。