Linux后台执行执行程序及环境变量优先级

背景故事:为什么写这个呢,因为有次给媳妇弄翻墙的shadows,配完了想让她每次开机就自动运行,然后发现了个事情,就是脚本有输出的时候直接用&是不大好的。还查了下,这可不应该啊,虽然说好久不用这个玩意,不过还是应该掌握的,所以就当记个笔记吧

关于用户环境变量profile的设置

登录后首先读取/etc/profile这个配置,这个配置是对所有用户生效的。然后依次寻找以下三个文件,这三个文件定义了对当前用户的配置

第一个是~/.bash_profile
第二个是~/.bash_login
第三个是~/.profile
高能预警: 以上三个文件只要有一个存在就不会读取后面的文件了,比如有了~/.bash_login就不读取~/.profile了

另外如果修改了profile的配置,直接修改后对于当前终端是不生效的,一般有两种方法使之生效

  1. source ~/.profile 【这里只是举例子,你修改的是哪个配置就source哪个配置】
  2. 退出当前终端再重新打开

关于sudu命令

当你使用sudo去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如PATH这样的环境变量,在sudo命令下已经被重置成默认状态了。所以当一个刚初始化的PATH变量中不包含你所要运行的程序所在的目录,用sudo去执行,你就会得到”command not found”的错误提示。要想改变PATH在sudo会话中的初始值,用文本编辑器打开/etc/sudoers文件,找到”secure_path”一行,当你执行sudo 命令时,”secure_path”中包含的路径将被当做默认PATH变量使用。添加所需要的路径(如 /usr/local/bin)到”secure_path”下,如下

1
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

关于export

使用export可以直接声明环境变量,不过这种方式只对当前终端有效。所以一般在脚本里或测试时会用到这种方式,如果是需要每次登陆都有这些变量的话,还是需要写入全局或用户的配置中去。

关于后台运行脚本或命令

一般用两种方法,一种是直接command+&,还有种就是nobub command+&。一般来说用第二种的多一点,因为如果脚本有输出的话终端就会被占用,而且关闭终端后台进程会终止;但是第二种会把输出记录在当前目录nohub.out的输出中,而且关闭端口后台进程也不会结束。

看命令吧,下面通过演示怎么在后台执行这个没用的脚本

1
2
3
4
5
while true;do
ehco "Hello world, `date`"
sleep 2
done
#named hello.sh

  • 使用&

    1
    2
    sh hello.sh &
    #像上面这种有输出的,不要用这个,反正不推荐
  • 使用nohub

    1
    nohub sh hello.sh &
  • 查看后台任务jobs

    1
    2
    3
    4
    jobs
    #bogon:tmp arvon$ jobs
    #[1]- Running sh xxx.sh &
    #[2]+ Running sh ppp.sh &
  • 调出后台任务fg

    1
    2
    fg %1
    fg %2
  • 使用ctrl+z将前台程序放入后台,此时程序会变为stop

  • 使用bg将后台暂停的程序启动
    1
    2
    3
    4
    5
    bogon:tmp arvon$ jobs
    [1]- Stopped sh xxx.sh
    [2]+ Stopped sh ppp.sh
    bogon:tmp arvon$ bg %1
    [1]- sh xxx.sh &