标签: bash

如何获取/bin/su -c 启动的进程的PID

我正在为一个 java 应用程序编写一个 init.d 脚本。但是 java-app 应该由另一个用户运行。

(我使用的操作系统是 Debian Squeeze。)

我已经得到了这个:

/bin/su - $USER - c "cd $PATH;echo $PASSWORD | $JAVA -Xmx256m -jar $PATH/app.jar -d > /dev/null" & PID=$!
/bin/su - $USER - c "echo $PID > $PIDFILE"
Run Code Online (Sandbox Code Playgroud)

但这当然只会保存“/bin/su”进程的pid而不是创建的java进程的pid。

linux bash pid

5
推荐指数
1
解决办法
4184
查看次数

获取进程的交换使用情况

我正在寻找一种从 shell 脚本获取特定进程的交换使用情况的方法。Top 可以显示此信息,但只能在交互模式下显示。批处理模式只会在 .toprc 存在时显示自定义,但您不能在命令行上指定特定的 .toprc。我找到了这个脚本,但我的服务器上的 /proc/*/smaps 中没有交换条目:

# find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi swap '{}'/smaps \;
#
Run Code Online (Sandbox Code Playgroud)

所以脚本只为每个进程输出 0。

有没有办法找到这些信息?我在 RHEL5.1 2.6.18-53.el5 x86_64 上。

编辑:

需要明确的是,当我询问“交换使用情况”时,我的意思是已调出到交换文件系统的进程使用的内存量(当前未位于主内存中的内存)。假设没有更好的方法,我将默认使用 (virtual - rss) 通过ps -o vsz,rss.

linux bash

5
推荐指数
1
解决办法
4024
查看次数

iptables - 清除具有特定目标地址的所有 PREROUTING 规则

我有一个添加 iptable PREROUTING 规则的脚本。他们都有同样的问题要解决。当我运行这个:

 iptables --list PREROUTING -t nat
Run Code Online (Sandbox Code Playgroud)

我看到这样的输出:

 DNAT       tcp  --  anywhere             165.193.122.18      tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.91.11        tcp dpt:https to:192.168.2.1:443
 DNAT       tcp  --  anywhere             63.135.90.224       tcp dpt:https to:192.168.2.1:443
Run Code Online (Sandbox Code Playgroud)

似乎我应该能够通过编写这样的命令来删除所有这些规则......

"drop all PREROUTING rules that go to 192.168.2.1:443"
Run Code Online (Sandbox Code Playgroud)

因此,在查看 itables 的选项时,我似乎需要使用 -D 选项。但我不知道给出它的规则。:-(

因此,我可能需要查询现有规则,grep 将其限制为目标 192.168.2.1:443,然后运行 ​​-D 并为每个规则传递规则编号。我不知道该怎么做。任何帮助,将不胜感激。

谢谢!

电动汽车

bash iptables grep

5
推荐指数
1
解决办法
1万
查看次数

如何使用 find 对带空格的文件名进行 for 循环

我有以下脚本 - 它应该使用 find 循环文件名,但它接缝以空格分隔文件名?我需要文件名保持完整

#!/bin/bash

for file in `find -name "*.avi"`
do
./myscript $file
done
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

谢谢

linux bash find

5
推荐指数
2
解决办法
4996
查看次数

为什么'pkill /?' 杀死我的 SSH 会话?

通过 SSH 以 root 身份运行以下命令 (bash) 后:

    pkill --help
    pkill -h
    pkill /?
Run Code Online (Sandbox Code Playgroud)

前两个命令没有为我提供任何信息,这就是为什么运行第三个命令(有点本能......)。

接下来发生的事情是,我与服务器的 SSH 会话关闭,并且无法重新连接。我猜它停止了所有(或大部分)正在运行的进程,包括负责此类会话的守护进程。

我想了解为什么会发生这种情况:我的输入的确切评估(逐步)是什么以及它是什么原因造成的。

我最好的猜测是它与 shell 对 '?' 的评估有关。字符,它可能转换为一些单字符表达式的列表,这些表达式被传递给 pkill,而 pkill 又关闭了这些 PID。

linux ssh bash root

5
推荐指数
2
解决办法
3260
查看次数

通过 ssh 在远程服务器上使用本地 LS_COLORS 而无需修改远程服务器

我可以访问大量不同的 ssh 帐户,我可以想象有数百个,我在不同场合使用这些帐户。其中一些是个人的,其中一些是我从客户那里得到的并且是共享的,而且很多都是暂时的。为一次使用而创建,一段时间后将自动删除。

现在我的问题是我使用了两个 .dircolors,一个浅色和一个深色主题。我非常喜欢这个设置,但这意味着每次我 ssh 到服务器时都复制一个新的 .dircolors,并且在共享帐户上偶尔会惹恼其他人。我尝试修改我的 ssh 脚本以允许我使用我的本地 LS_COLORS,但是我遇到了一些问题。

如果我使用: ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash --noprofile --norc' 它有效,但不完全可用,因为它忽略了所有系统默认信息。

如果我使用: ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash' 它不起作用,因为 bash 通过 .profile 并加载不同的 LS_COLORS。

关于如何加载默认 .bash_profile/.bashrc 并拥有自己的 LS_COLORS 的任何建议?

ssh bash environment-variables

5
推荐指数
1
解决办法
2111
查看次数

`ssh foo "<command/>"` 没有加载远程别名?

总结:为什么会失败

$ ssh foo 'R --version | head -n 1'
bash: R: command not found
Run Code Online (Sandbox Code Playgroud)

但这成功了

$ ssh foo 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh foo 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux86_64/bin/R'
$ ssh foo '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)
Run Code Online (Sandbox Code Playgroud)

? 细节:

我是 2 个集群的(无根)用户。一个使用环境模块,因此该集群上的任何给定服务器都可以(通过module add)提供几乎相同的资源。不幸的是,我也必须在另一个集群上工作,它有单独管理的服务器,所以我养成了这样做的习惯,例如,

EXEC_NAME='whatever'
for S in 'foo' 'bar' 'baz' ; do …
Run Code Online (Sandbox Code Playgroud)

linux ssh bash bashrc login-script

5
推荐指数
1
解决办法
3016
查看次数

如何将多行变量作为参数传递给函数

试图捕获和显示 curl 的输出让我发疯。我终于找到了一种解决方法,但我不明白为什么需要它。

这是一个失败的脚本:

#!/bin/bash
function echo_output() {
    echo $@
}

CURL_OUTPUT=$(curl -sL --head www.google.com/foobar)
echo_output "$CURL_OUTPUT"
Run Code Online (Sandbox Code Playgroud)

这是一个有效的脚本:(转义回车)

#!/bin/bash
function echo_output() {
    OUT="${@//[$'\r']/\r}"
    echo $OUT
}

CURL_OUTPUT=$(curl -sL --head www.google.com/foobar)
echo_output "$CURL_OUTPUT"
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?换行符和“$@”有什么特别之处?谢谢您的帮助。

linux bash

5
推荐指数
1
解决办法
6867
查看次数

使用“curl | bash”反馈远程执行脚本

我正在一个使用很多这样的命令的平台上工作: ssh login@server.com 'curl http://some_server/script.sh | bash'

这对于远程执行脚本来说非常干净和方便,但是,无论如何我都看不到获取脚本的输出/退出代码。任何人都可以找出一些方法来确保脚本已正确执行(从启动 ssh 的主机的角度来看)。

remote-access ssh bash remote curl

5
推荐指数
1
解决办法
3万
查看次数

Tmux 和 encryptfs 在重新连接时导致“(无法访问)”目录

我正在运行带有加密主目录 (encryptfs) 的 Ubuntu 13.04 服务器。我保持一个 tmux 会话处于打开状态,其中包含我的开发环境(vim 等)。当我断开连接时,我将断开 tmux 会话,然后断开 ssh 连接。稍后,当我重新连接并重新附加 tmux 会话时,我会收到如下错误:

fatal: Could not change back to '(unreachable)/*****': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这通常意味着 vim(在分离时仍然打开)保存到错误的位置,并且实际上不会将文件写入磁盘,只会写入“无法访问”目录,这似乎是临时的。

如果我从 bash运行 ' pwd '(重新连接后没有做任何其他事情),我会得到正确的目录/home/***/***。如果我运行 'git status',我会得到上面的消息(没有这样的文件),如果我在 vim 中运行' :pwd ',我会得到“ (unreachable)/*** ”。

对此的临时解决方法是运行 ' cd 。' 在运行任何其他命令之前,它允许 git/vim/etc 实际查看目录。这很不方便,因为我经常在 tmux 中打开许多面板/屏幕,我必须运行 ' cd 。' 每次我重新连接时。最重要的是,我必须确保在断开连接之前关闭 vim 或其他任何东西,否则如果我不小心,我可能会丢失数据。

我在某处看到另一个线程,将此归因于 encryptfs在注销时卸载$HOME,但没有回复。这似乎是一个可能的原因,但我不知道从哪里开始。有什么帮助吗?

linux bash tmux

5
推荐指数
1
解决办法
1060
查看次数