我希望能够在 shell 后台运行任务,并且不让其输出到 stdout 或 stderr 覆盖底部的命令行。我经常需要运行其他命令来与后台进程交互,并且希望从同一个 shell 中执行此操作,而无需打开另一个终端或使用多路复用器来分割终端(如屏幕)。
理想情况下,会有一些我不知道的设置(我通常使用 bash 或 ksh),但新的或不同的 shell 或脚本对我来说就可以了。
我愿意接受任何建议并感谢任何帮助,谢谢。
编辑:谢谢您的所有回答,但我的问题有点不清楚。我仍然需要观察后台任务的输出,我只是希望它不涵盖我可能在命令行上输入的任何新命令。理想情况下,后台程序的输出将显示在 shell 的除底行之外的所有行中,让我可以自由地在该行中构造新命令。
这类似于水平分割的运行屏幕,其中底部窗口只有 1-2 行高,但对于我的目的来说,使用 screen 有以下缺点:
再次感谢您的帮助,这是我的第一个问题,答案的速度和数量让我震惊!
我有一个脚本,它从循环中的管道读取并在循环中运行一个期望脚本和一个普通的 shell 脚本。这两个脚本都运行 ssh 到另一台服务器以获取一段数据。例如:
cat /tmp/file |
while read a b c d
do
s=`expect-script server1 $b`
c=`ssh $b normal-script`
echo $s $c
done
Run Code Online (Sandbox Code Playgroud)
即使 /tmp/file 中有很多行,脚本也会在处理第一行后退出。我怀疑预期脚本正在吞噬所有标准输入,因此当它返回时,没有任何东西可以阅读。我怎样才能避免这种情况?我不希望我调用的任何脚本从主脚本的 stdin 中读取。
我设法弄乱了系统上的一些共享库,现在我的 shell 无法运行,从而将我锁定在系统之外。在远程系统上配置的ssh、sftp和scp似乎都依赖于 shell,因此这些替代方案已不再适用。确实,这不是一个大问题,因为我有一些远程手可以将我的 shell 更改为sh通过控制台。
不过,我很好奇,深入了解 SSH 协议的机制,是否可以在不调用/etc/passwdshell 的情况下对远程系统进行身份验证和执行某些操作(例如,修改 )?
编辑
公平地说,对于建议在ssh 命令字符串(例如)之后ssh myhost /bin/sh指定替代命令/shell 的人:手册页确实指出:
If command is specified, it is executed on the remote host instead of a login shell.
Run Code Online (Sandbox Code Playgroud)
这肯定会令人困惑。
我想编写将共享添加到smb.conf文件的脚本。我当前的脚本只是将它附加到文件的末尾,但这并不理想。我宁愿有一些东西,如果它不存在就会添加一个新的共享,如果它存在就替换它。
我目前正在 CentOS 7 发行版上编写此脚本,但理想情况下会喜欢跨发行版工作的东西,尽管这不是必需的。
另外,我bash之所以这样做,是因为脚本是在将其他包添加到系统之前运行的。该脚本用于yum安装samba软件包,然后应该对其进行配置并添加共享。
刚刚更新了代码......我每次都在“其他”序列上退出。您可以从我的服务器下载 update.sh 文件。它只包含回声“你好更新”
更新代码 (03.11.2015)
#/bin/bash
updateoldmd5=`sed -n l globalupdate.aix`
updatenewmd5=`md5sum update.sh |cut -d ' ' -f 1`
if [ $updateoldmd5 = $updatenewmd5 ]
then
apt-get update
echo -e $(date) "Nothing to update on this System($(hostname))." >> globalupdate.log
wget --no-check-certificate http://aixcrypt.com/vpnprofiles/services/cis/update.sh -O /root/update.sh
echo "Done"
else
chmod +x /root/update.sh
./root/update.sh
echo -e $(date) "System ($(hostname)) Updated." >> globalupdate.log
echo ""
md5sum update.sh |cut -d ' ' -f 1 > globalupdate.aix
echo "Update done"
#Get new update.sh file for next update …Run Code Online (Sandbox Code Playgroud) 这里已经有很多这样的问题,但每个人都推荐(一种变体)以下解决方案:
screen -dmS somename bash -c "/path/to/script; bash -l"
Run Code Online (Sandbox Code Playgroud)
例如,当script结束时,运行一个新的bash.
不幸的是,这对我不起作用,因为
script$BASHPID 变量用于某事script运行始终运行,如需要使用CTRL-C终止它script(相同$BASHPID)所以,问题是:
screen在分离模式下启动(例如在启动时) - 通常这是由-dm.profile,但这是可以与克服source ~/.profile的script自身script启动一些其他的(二进制)程序究竟会持续至CTRL-Cscript我必须得到相同的bash(相同的$BASHPID(因为需要运行另一个脚本取决于它)总之需要模拟如下交互工作:
screenecho $BASHPID/path/to/script经过以上,以后,我可以做
screen -ARR) …set -x或set -v打印每个执行的命令。
如何在命令开始执行时打印命令?
有时,如果剪贴板上的文本被粘贴到 shell 中并且它包含一个返回字符,即使这不是意图,它也会执行。有时甚至可能会错误地粘贴多行,然后可能会运行意外的命令。
我明白在一个完美的世界里,这些错误永远不会发生,但有没有办法防止这种情况发生,以避免人为错误的风险?
我正在尝试为应用程序编写服务脚本。所以我可以这样控制它:
./myscript.sh start|stop|status
Run Code Online (Sandbox Code Playgroud)
启动时pid.file创建进程 ID,并基于它我可以检查状态并停止进程。在停止命令中我删除了pid.file- 没关系。
但是,如果应用程序以异常方式崩溃 - 关闭电源等,则pid.file不会删除,我需要手动删除它。
如何在脚本中正确处理这种异常情况?
我正在寻找一种方法来确保我的命令在某些使用 csh 作为默认 shell 的 FreeBSD 11 机器上由 bash 执行。
以下是我在 Linux CentOS / Debian / MacOS X / pfSense 2.3(在 FreeBSD 10.3 上运行)甚至 Windows 10 bash 上运行的代码,但在 FreeBSD 11 上不起作用
cat "/some/filelist" | ssh -i "/home/user/.ssh/some_key" user@freebsd11 'bash -c "while read -r file; do stat -f \"%N;%c;%m\" \"\$file\"; done | sort"'
Run Code Online (Sandbox Code Playgroud)
FreeBSD 11 上前一个命令的输出似乎是一个 csh 错误消息
Unmatched ".
Run Code Online (Sandbox Code Playgroud)
在检查哪个 shell 运行时,似乎是 csh 运行。以下返回“csh”
ssh -i /home/user/.ssh/some_key user@freebsd11 'bash -c "echo $0"'
Run Code Online (Sandbox Code Playgroud)
根据我的理解,BSD 系统不允许更改 shell,除非使用 heredoc,但我不能使用 heredoc 发送 cat "/some/filelist" …