Crontab con ed con i comandi di flusso, si traduce in "non modifica"

0

Domanda

Sto cercando di aggiungere una riga al mio file crontab. So che ci sono altri modi per risolvere questo problema, ma ancora voglia di sapere che cosa ha causato. Il comando viene eseguito su raspberry pi 3 B+, raspbian lite è installato, con GNU ed 1.15, cron 3.0pl1-134+deb10u1.

Il comando che mi sono bloccato su questo:

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed crontab -e
902
909
No modification made

Sto aspettando di aggiungere la riga #asdf alla fine del mio file crontab, ma non è così.

Impostazione EDITOR='tee -a' come suggerito in https://stackoverflow.com/a/30123606/8842387 non risolve il problema. Quindi credo che sia il problema con cron.

Stranamente, quando do ed i comandi direttamente dalla tastiera, piuttosto che la riproduzione in streaming, funziona e basta. Forse subshell creazione causato il problema?

Qui vi allego un paio di ultime righe da strace risultato.

$ echo -e 'a\n#asdf\n.\nwQ' | EDITOR=ed strace crontab -e
execve("/usr/bin/crontab", ["crontab", "-e"], 0x7ee54c14 /* 29 vars */) = 0
access("/etc/suid-debug", F_OK)         = -1 ENOENT (No such file or directory)
...
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 659
_llseek(3, -393, [266], SEEK_CUR)       = 0
read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 393
close(3)                                = 0
getpid()                                = 18579
socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = 0
send(3, "<78>Nov 20 15:31:25 crontab[1857"..., 56, MSG_NOSIGNAL) = 56
openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied)
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=2995, ...}) = 0
read(4, "# Locale name alias data base.\n#"..., 4096) = 2995
read(4, "", 4096)                       = 0
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_GB.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_GB/LC_MESSAGES/libc.mo", O_RDONLY) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=1433, ...}) = 0
mmap2(NULL, 1433, PROT_READ, MAP_PRIVATE, 4, 0) = 0x76f50000
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "crontabs/pi/: fdopen: Permission"..., 39crontabs/pi/: fdopen: Permission denied) = 39
exit_group(1)                           = ?
+++ exited with 1 +++

openat(AT_FDCWD, "crontabs/pi", O_RDONLY) = -1 EACCES (Permission denied) sembra un po ' sospetto, ma non certo perché si apre il file in sola lettura.

EDIT: Come suggerito da @campanellino, mi sono imbattuto EDITOR=ed strace crontab -e per vedere cosa strace dà su una sessione interattiva. Il risultato è quasi lo stesso (con variazioni sul pid e fd numeri).

Ho notato che in esecuzione echo "..." | EDITOR=ed crontab -e terminato con messaggio No modification made ma con strace il processo si interrompe senza alcun messaggio. (EDITOR=ed strace crontab -e 2>&1 | grep "No mod" viene stampato nulla). Indovinare il strace innesca diversi errori.

bash cron ed linux
2021-11-20 06:41:51
1

Migliore risposta

0

In seguito il mio commento VISIVO, questi ha funzionato per me:

( unset VISUAL; printf '%s\n' a '#abcd' . wq | EDITOR=ed crontab -e )
printf '%s\n' a '#abcd' . wq | VISUAL=ed crontab -e

Nel mio ambiente, sia in VISUAL EDITOR e sono impostati su "vim"

O, più rotonda, ma non c'è bisogno di scimmia con env vars. Questo permette anche di farlo in silenzio:

crontab <(printf '%s\n' a '#asdf' . '%p' | ed -s <(crontab -l))

Stavo facendo su un Mac. Su Linux, sono in grado di riprodurre le vostre osservazioni, ma non può spiegare.

Un piccolo tweak per l'ultimo comando funziona:

printf '%s\n' a '#asdf' . '%p' Q | ed -s <(crontab -l) | crontab -
2021-11-21 20:34:51

Grazie per la risposta!! Ho paura di dire che nessuno dei due righe sopra ha funzionato per me, e l'ultima, che dà /dev/fd/63: Not a regular file. Forse alcuni di configurazione di sistema di essere diversi?
bivoje

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................