我有包含以下命令的文本文件
command1 file1_input; command2 file1_output
command1 file2_input; command2 file2_output
command1 file3_input; command2 file3_output
command1 file4_input; command2 file4_output
command1 file5_input; command2 file5_output
command1 file6_input; command2 file6_output
command1 file7_input; command2 file7_output
................
................
................
................
................
我将此文件命名为“命令”,然后使用“授予它权限”修改模式 a+x”
我希望先运行命令 1,然后运行命令 2。我还希望将其立即应用于所有文件(文件 1、文件 2、...等)。我怎样才能修改这个文件的内容来做到这一点?
我尝试了以下方法,但没有成功:
(
command1 file1_input; command2 file1_output
command1 file2_input; command2 file2_output
command1 file3_input; command2 file3_output
command1 file4_input; command2 file4_output
command1 file5_input; command2 file5_output
command1 file6_input; command2 file6_output
command1 file7_input; command2 file7_output
................
................
................
................
................
)&
答案1
GNU并行做这个:
$ parallel < /path/to/file/containing/commands
与同时在后台运行所有进程相比,让 GNU 并行管理进程的优点是 GNU 并行可以限制同时作业的数量,使其保持在系统内存和处理能力范围内,例如通过--jobs
、--load
、--memfree
等。
如果您只是同时运行文件中的所有行,则运行系统时可能会耗尽 RAM 或 CPU 功率,从而导致系统变得极其缓慢。如果您的系统首先耗尽 RAM,然后耗尽交换空间,您的进程甚至可能开始崩溃。
答案2
使线条如下:
(command1 file1_input; command2 file1_output) &
(command1 file2_input; command2 file2_output) &
...
每行将按顺序执行两个命令,但每行将作为并行后台作业进行分叉。
如果您希望仅在第一个命令成功完成时才执行第二个命令,请将分号更改为&&
:
(command1 file1_input && command2 file1_output) &
(command1 file2_input && command2 file2_output) &
...