linux 特定用户 运行脚步

2017-06-02 15:46:38 wawa8899 阅读数 12776

su - user -c program

其中,user为指定用户,program为要执行的程序


例如:

启动cassandra

不指定用户:

nohup -c "$CASSANDRA_DIR/bin/cassandra" >> $CASSANDRA_DIR/logs/system.log 2>&1 &

用用户“cassandra”来启动cassandra服务:

su - cassandra -c nohup -c "$CASSANDRA_DIR/bin/cassandra" >> $CASSANDRA_DIR/logs/system.log 2>&1 &

2020-01-07 14:07:13 sinat_42759524 阅读数 312

当你按下开机键或者启动一个虚拟机的时候,你就启动了一系列事件,然后你就会进入一个功能完备的系统中,在系统启动以及登录或者注销的过程中,还可以让系统执行特定的操作,以下介绍几个比较传统的方法。(bash)

启动时执行shell脚本

1.使用cron任务

除了常用格式(分 / 时 / 日 / 月 / 周)外,cron 调度器还支持 @reboot 指令。这个指令后面的参数是脚本(启动时要执行的那个脚本)的绝对路径。

然而,这种方法需要注意两点:

  • a) cron 守护进程必须处于运行状态(通常情况下都会运行),同时
  • b) 脚本或 crontab 文件必须包含需要的环境变量(如果有的话,参考 StackOverflow 获取更多详细内容)。

2.使用/etc/rc.d/rc/local

这个方法对于 systemd-based 发行版 Linux 同样有效。不过,使用这个方法,需要授予 /etc/rc.d/rc.local 文件执行权限:

chmod +x /etc/rc.d/rc.local

然后在这个文件底部添加脚本。

下图说明如何分别使用 cron 任务和 rc.local 运行两个示例脚本(/home/gacanepa/script1.sh 和 /home/gacanepa/script2.sh)。

script1.sh:

#!/bin/bash
DATE=$(date +'%F %H:%M:%S')
DIR=/home/gacanepa
echo "Current date and time: $DATE" > $DIR/file1.txt

script2.sh:

#!/bin/bash
SITE="Tecmint.com"
DIR=/home/gacanepa
echo "$SITE rocks... add us to your bookmarks." > $DIR/file2.txt
  • 启动时执行 Linux 脚本

记住,一定要提前给两个示例脚本授予执行权限:

$ chmod +x /home/gacanepa/script1.sh
$ chmod +x /home/gacanepa/script2.sh

在登录或注销时执行 Linux 脚本
要在登录或注销时执行脚本,分别需要使用 ~.bash_profile 和 ~.bash_logout 文件。多数情况下,后者需要手动创建。在每个文件的底部,添加调用脚本代码,如前面例中所示,就可以实现这个功能。

作者:少帅

出处:少帅的博客–http://www.cnblogs.com/wang3680

您的支持是对博主最大的鼓励,感谢您的认真阅读。

本文版权归作者所有,欢迎转载,但请保留该声明。

2017-03-07 10:54:40 zzwdkxx 阅读数 0

转自:http://blog.csdn.net/keheinash/article/details/50641090

内存泄露是C/C++程序员经常需要面对的问题,除了有效地经常查找出内存泄露的位置外,在嵌入式的开发中,还经常需要确定自己写的程序是否存在内存泄露的情况

Linux系统下,我们可以利用以下命令来获取特定进程的运行情况: 
cat /proc/$PID/status

其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息比较多,包含了物理内存/虚拟内存的使用状况,监控进程是否有内存泄露的问题,一般查看进程占用物理内存的情况:

VmRSS: xxxkB

可以采用grep命令过滤出我们需要的信息:

cat /proc/$PID/status | grep RSS >> "$LOG" #过滤包含RSS的行,并且重定向到参数LOG表示的文件
  • 1
  • 1

由于PID号需要通过进程名获取,同样使用grep命令过滤出我们指定进程的进程号:

ps | grep $PROCESS | grep -v 'grep' | awk '{print $1;}'#$PROCESS表示进程名字
  • 1
  • 1

再设置一个循环,每十秒获取一次信息并写入指定文件,完整的脚本如下:

#!/bin/bash

PROCESS=进程名
LOG="/mnt/memlog.txt"

sleep 10

#删除上次的监控文件
if [ -f "$LOG" ];then 
    rm "$LOG"
fi

#过滤出需要的进程ID
PID=$(ps | grep $PROCESS | grep -v 'grep' | awk '{print $1;}')

while [ "$PID" != "" ]    
do
    cat /proc/$PID/status | grep RSS >> "$LOG"#过滤出VmRSS行
    sleep 5
    PID=$(ps | grep $PROCESS | grep -v 'grep' | awk '{print $1;}')
done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
1

2016-11-03 10:26:52 GW569453350game 阅读数 7209

Ubuntu/Debian

rc.local 中的命令会在系统启动完成之后运行(SysVinit)。
1 . 编辑:

/etc/rc.local

添加想要被执行的命令即可(默认是以root用户执行)。

注: 有些很特殊的情况 /etc/rc.local 不会被执行,可以 编辑 /etc/init.d/rc.local see link: http://www.linuxidc.com/Linux/2016-12/138665.htm

2 . 以期望的用户执行命令:

su -c 'ls -l "myfile.txt"' guowei &

解释: 其中需要被执行的命令是 ls -l "myfile.txt", 期望的用户的 guowei& 表示在后台运行。

3 . 开机以 screen 运行程序脚本,并添加环境变量(no-login):

#!/bin/bash

# 环境变量要在 su 之前设置好,然后 sudo -E 保持环境变量
# 如果直接是root用户执行该脚本,则只需要 su -p 或者 su -m 保持环境变量即可
export GUOWEI_DIR=/home/guowei
export PATH=/opt/bin:$PATH
source /home/guowei/.bashrc

if [ -e /opt/my_app ]; then
#   sudo -E su -p -l guowei << BASH    # 如果要以 guowei 用户执行那些程序的话,去掉注释即可。 su - 表示切换的环境变量,sudo 需要添加 -E 选项。
    su -p guowei << BASH  # 以用户 guowei 执行以下命令,注意不要加 sudo, 否则就需要以 sudo -E 执行。
    cd /home/guowei
    screen -d -m /opt/my_app
#	BASH
fi

# 或者将 export 写在 -c 内部, 加上 -c 和 单引号:
su guowei -c 'export A=/opt/bla; blabla~; /opt/my_app'  // 注意:双引号跟单引号有区别

然后 ssh 登陆后, 切换到对应用户screen -ls 可以看到在后台运行的程序。


OpenSUSE:

OpenSUSE启动程序的设置比较特殊(没有 /ect/rc.local 文件),主要有这三个文件(SysVinit):

1./etc/init.d/after.local

此文件默认不存在,需要用户手动创建。它是在系统已完成运行级的启动后执行的脚本。与其它系统的 /etc/rc.local 相似。

2./etc/init.d/boot.local

此文件在系统启动后,进入运行级前就执行的用户脚本。注意这一文件执行时网络等设备都尚未就绪(没有网络连接),使用时应小心。

3./etc/init.d/before.local

该文件在也是在rc启动脚本之前执行,但是会在boot.local之后执行。

因此,对于大多数启动程序来说,将其加到 /etc/init.d/after.local 中较为合适。

如果系统是使用 Systemd, 则对应的文件为: /etc/init.d/after-local

To enable /etc/init.d/after-local:
systemctl enable after-local.service
To check status of /etc/init.d/after-local:
systemctl status after-local.service

总的来说,对于使用SysVinit系统来说,如果是一般的用户程序,只需要新建文件:

vi /etc/init.d/after.local

添加自定义的启动命令即可:

#!/bin/sh

/usr/local/bin/redis-server /etc/redis/6379.conf

ref link:

CentOS:

1、在 /etc/init.d/ 目录下新建一个文件:autostart.sh

#!/bin/sh
#chkconfig: 2345 80 80
#description: auto start my app

sh xxx &  # 期望被执行的命令

2、cd 到 /etc/init.d目录下,输入命令:

chkconfig --add autostart.sh
chkconfig autostart.sh on
2017-01-12 19:23:22 wh211212 阅读数 2544

在Linux和其他类Unix操作系统中,只有root用户可以运行所有命令并在系统上执行某些关键操作,如安装和更新,删除包,创建用户和组,修改重要的系统配置文件等。
然而,承担root用户角色的系统管理员可以允许其他正常系统用户在sudo命令和几个配置的帮助下运行某些命令以及执行包括上述的一些重要系统操作。

或者,系统管理员可以共享root用户密码(这不是推荐的方法),以便正常系统用户可以通过su命令访问root用户帐户。

sudo允许用户以root用户身份(或另一个用户)执行安全策略指定的命令:

  • 它读取并解析/etc sudoers,查找调用的用户及其权限,
  • 然后提示调用用户输入密码(通常是用户的密码,但也可以是目标用户的密码,也可以使用NOPASSWD取消密码验证),
  • 之后,sudo创建一个子进程,在其中调用setuid()切换到目标用户
  • next,它执行一个shell或在上面的子进程中作为参数给出的命令。

以下是十个/etc/sudoers文件配置,以使用Defaults条目修改sudo命令的行为。

sudo cat /etc/sudoers | less

这里写图片描述

1.设置安全路径

这是用于每个使用sudo运行的命令的路径,它有两个重要性:

  • 在系统管理员不信任sudo用户具有安全的PATH环境变量时使用
  • 要分离“根路径”和“用户路径”,只有由exempt_group定义的用户不受此设置的影响。

要设置它,请添加行:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

2.在TTY用户登录会话上启用sudo

要启用从真实tty调用sudo,而不是通过cron或cgi-bin脚本等方法调用,请添加以下行:

Defaults  requiretty   

3.运行Sudo命令使用pty

有些时候,攻击者可以使用sudo运行恶意程序(例如病毒或恶意软件),这将再次分叉保留在用户的终端设备上的后台进程,即使在主程序已经完成执行时。

为了避免这种情况,您可以将sudo配置为仅使用use_pty参数从psuedo-pty运​​行其他命令,无论I /O日志是否已打开,如下所示:

Defaults  use_pty

4.创建Sudo日志文件

默认情况下,sudo日志通过syslog(3)。但是,要指定自定义日志文件,请使用logfile参数,如:

Defaults  logfile="/var/log/sudo.log"

要在自定义日志文件中记录主机名和四位数年份,请分别使用log_host和log_year参数,如下所示:

Defaults  log_host, log_year, logfile="/var/log/sudo.log"

这里写图片描述

可以看出sudo.log已经生效

5.记录Sudo命令输入/输出

log_input和log_output参数允许sudo在伪tty中运行命令,并记录所有用户输入和所有输出发送到屏幕。

默认I / O日志目录为/var/log/sudo-io,如果有会话序列号,则存储在此目录中。您可以通过iolog_dir参数指定自定义目录。

Defaults   log_input, log_output

支持一些转义序列,例如%{seq},其扩展为单调递增的基础36序列号,例如000001,其中每两个数字用于形成新的目录,例如。00/00/01,如下例所示:

[root@linuxprobe ~]# cd /var/log/sudo-io/
[root@linuxprobe sudo-io]# ll
total 8
drwx------ 3 root root 4096 Jan 12 18:58 00
-rw------- 1 root root    7 Jan 12 19:08 seq
[root@linuxprobe sudo-io]# cd 00/00/06/
[root@linuxprobe 06]# ls
log  stderr  stdin  stdout  timing  ttyin  ttyout
[root@linuxprobe 06]# cat log 
1484219333:root:root::/dev/pts/0
/root
/bin/bash

6.讲解​​Sudo用户

要讲授sudo用户关于系统上的密码使用,请使用如下所示的lecture参数。
它有3个可能的值:

  • always - 总是讲一个用户。
  • once - 只在用户第一次执行sudo命令时使用(当没有指定值时使用)
  • never - 从不讲授用户。
Defaults  lecture="always"

此外,您可以使用lecture_file参数设置自定义讲义文件,在文件中键入相应的消息:

Defaults  lecture_file="/path/to/file"

7.输入错误的sudo密码时显示自定义消息

当用户输入错误的密码时,命令行上将显示特定的消息。默认消息是“sorry,try again”,您可以使用badpass_message参数修改消息,如下所示:

Defaults  badpass_message="Password is wrong, please try again,thank you!"

8.增加sudo密码尝试限制

参数passwd_tries用于指定用户尝试输入密码的次数。 默认值为3:

Defaults   passwd_tries=5 

9.让Sudo输入错误的密码时输入提示

Defaults  insults 

10.了解更多Sudo配置

http://blog.csdn.net/wh211212/article/details/52923673

linux定时执行脚本

阅读数 3262