Articles of bash

如果不存在的话,可以单线程创build一个文件

我想要一个Bash单行文本,如果它不存在,就会自动创build一个文件。 这意味着本质上“如果文件不存在,创build它”,但确保没有其他人pipe理在创build文件之间的小空间中创build文件。

stdout / stderr在start-stop-daemon中redirect

我正在尝试编写init config,将守护进程的输出redirect到两个文件(stdout和stderr)。 问题是,它不工作。 我正在阅读这个 。 所以,我已经完成了这个shell脚本来testing这个方法。 它不工作: PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="Seed kurokikaze starter" #NAME=node DAEMON="/etc/node-version/0.1.99/bin/node" DAEMON_ARGS="/etc/seed/kurokikaze/server.js" DAEMON_DIR="/etc/seed/kurokikaze" APPLOG_FILE="/var/log/seed/kurokikaze" ERRLOG_FILE="/var/log/seed/kurokikaze-err" PIDFILE="/var/run/seeds/kurokikaze.pid" SCRIPTNAME="/etc/seed-init/kurokikaze" NCMD="exec $DAEMON $DAEMON_ARGS 1>>$APPLOG_FILE 2>>$ERRLOG_FILE" start-stop-daemon -Sbmv –pidfile $PIDFILE –chdir ${DAEMON_DIR} –exec $DAEMON –startas /bin/sh — $NCMD 但是,如果你在不使用独立的shell包装守护进程的情况下启动它,它将按照预期工作(只要没有stderr / stdoutredirect): start-stop-daemon -Sbmv –pidfile $PIDFILE –chdir ${DAEMON_DIR} –exec $DAEMON — ${DAEMON_ARGS} 问题是:为什么第一个脚本不起作用? 系统是Debian Lenny, start-stop-daemon版本是1.14.29

我如何回收一个不知道的过程?

与以前的许多问题类似,我发现自己正在做一个我希望在屏幕上运行的工作。 我不得不放弃这个过程,因为我需要断开连接。 现在我重新连接了,我看到这个过程还在运行。 我怎样“回收”这个过程,以便我可以看到它的输出并给出它的input? 这个问题不同于将正在运行的进程移动到屏幕上,因为它涉及重新打开丢失的stdin / out / err句柄。

我可以调用pushd / popd并防止它打印堆栈?

在bash中调用pushd / popd之后,它将打印出当前的目录栈。 有什么办法来防止这种行为,以便它会“行事不端”? unix工具中的这种噪音是不常见的。

rsync:如何排除最顶层目录中的Dotfiles?

在使用rsync在Bash下执行备份时,我试图排除顶部目录中的所有点文件和隐藏目录,但不包括其他目标目录中的所有点文件和隐藏目录。 例如: /copyme.c /.dontcopythisfile /.dontcopythisdirectory/or_its_contents /directory/.butcopymetoo rsync -a –include=".includeme" –exclude=".*" . DEST rsync -a –include=".includeme" –exclude=".*" . DEST无法在子目录中复制所需的点文件,但诸如–exclude="./.*"变体也会失败。 build议? 这是否需要一个过滤规则,而不是简单 – 排除?

在Redhat上,“kernel.suid_dumpable = 1”是什么意思?

我正在运行一个bash脚本来复制一些日志文件,然后在Red Hat盒子上重启一个服务。 每次执行脚本时,我都会在控制台上看到以下内容: [root@servername ~]# sh /bin/restart _nss.sh kernel.suid _dumpable = 1 Stopping Service: [ OK ] Starting Service: [ OK ] [root@servername ~]# 在这种情况下,“kernel.suid_dumpable = 1”是什么意思? 谢谢,IVR复仇者

Mac OS X中命令行的最大长度是多less?

我在Ruby on Rails中生成模型,其中一些表格有很多列。 Mac OS X中命令的最大长度是多less?

作为另一个用户启动一个脚本

我在/etc/init.d/中创build了一个脚本,它必须从其主目录中运行其他(非超级用户)用户的其他脚本,就好像他们启动了它们一样。 我使用以下sudo -b -u <username> <script_of_a_particular_user>启动这些脚本: sudo -b -u <username> <script_of_a_particular_user> 它工作。 但是,对于每个继续运行的用户脚本(例如一些看门狗),我都会看到一个相应的父级sudo进程,它仍然以root身份运行。 这在活动进程列表中创build一个混乱。 所以我的问题是: 如何从另一个用户启动(fork)另一个脚本作为另一个用户,并将其作为孤立的(独立)进程? 更详细的解释: 我基本上是试图提供给机器上的其他用户一个意思是在系统启动或系统closures时运行的东西,通过运行在其主目录中find的名为.startUp和.shutDown的各个子目录中find的可执行文件。 由于我没有find任何其他的方法来做到这一点,所以我写了我的bash脚本,完全是这样做的,我已经在/etc/init.d/中configuration它作为服务脚本(通过下面的框架示例)启动参数启动了.startUp目录中的所有内容,当它以stop参数运行时,它启动所有用户的.shutDown目录中的所有内容。 另外我也有兴趣,如果我可以使用一些现有的解决scheme来解决这个问题。 UPDATE 我查了一下,我发现这个问题: https : //unix.stackexchange.com/questions/22478/detach-a-daemon-using-sudo 接受的答案在那里,使用: sudo -u user sh -c "daemon & disown %1" ,适用于我。 但是,我也尝试不留%1 ,这是一样的。 所以这就是我所期待的对我的作用: sudo -u <username> bash -c "<script_of_a_particular_user> &" 我现在的另外一个问题是,为什么它没有被忽视呢? 无论如何,我是否还应该离开这个离别的电话呢? 更新2 显然这也可以工作: su <username> -c "<script_of_a_particular_user> &" […]

每次有人通过SSHlogin到Linux机器时执行程序

我有一个小的SSH服务器,我想写一个脚本来运行每次有人通过SSHlogin。 现在,我将如何去做呢? 我希望每次ANYBODYlogin时脚本都能运行,而且我需要至less访问login人员的用户名和login人员的IP地址。 我想过使用/etc/bash.bashrc ,但这是一个很好的解决scheme吗? 例如,有没有一种方法,用户可以禁用它的使用,从而禁用我的脚本? 如果是的话,我还有其他的select吗? 谢谢。

仅在成功时才隐藏shell命令的输出?

隐藏shell命令的输出通常涉及redirectstderr和stdout。 有没有内置的设施或命令默认隐藏输出,但错误转储所有累计输出? 我想运行这个作为远程ssh命令的包装。 现在我有他们使用redirect,但我不知道是什么让他们失败,他们只是太冗长。 编辑:最后,我创build了以下模板根据@Belmin的答案,我调整了一点累积脚本中的所有以前的命令,使用当前的进程标识符,自动删除日志,并添加一个失败的红色错误当出现错误时的消息。 在这个模板中,最初的silent包装将会成功,然后第三个命令失败,因为该目录已经存在: #!/bin/sh set -e SILENT_LOG=/tmp/silent_log_$$.txt trap "/bin/rm -f $SILENT_LOG" EXIT function report_and_exit { cat "${SILENT_LOG}"; echo "\033[91mError running command.\033[39m" exit 1; } function silent { $* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit; } silent mkdir -v pepe silent mkdir -v pepe2 silent mkdir -v pepe silent mkdir -v pepe2